import { BrowserRouter, Routes, Route } from "react-router-dom"; import { cn, getTodayKST, formatFullDate } from "@/utils"; import { useAuthStore, useUIStore } from "@/stores"; import { useIsMobile, useCategories, useCalendar } from "@/hooks"; import { memberApi } from "@/api"; import { useQuery } from "@tanstack/react-query"; /** * 프로미스나인 팬사이트 메인 앱 * * Phase 5: 커스텀 훅 완료 * - useMediaQuery, useIsMobile, useIsDesktop * - useScheduleData, useScheduleDetail, useCategories * - useScheduleSearch (무한 스크롤) * - useScheduleFiltering, useCategoryCounts * - useCalendar * - useAdminAuth */ function App() { const today = getTodayKST(); const isMobile = useIsMobile(); const { isAuthenticated } = useAuthStore(); const { showSuccess, toasts } = useUIStore(); // 커스텀 훅 사용 const { data: categories, isLoading: categoriesLoading } = useCategories(); const calendar = useCalendar(); // 멤버 데이터 (기존 방식 유지) const { data: members, isLoading: membersLoading } = useQuery({ queryKey: ["members"], queryFn: memberApi.getMembers, }); return (

fromis_9 Frontend Refactoring

Phase 5 완료 - 커스텀 훅

디바이스: {isMobile ? "모바일" : "PC"} (useIsMobile 훅)

오늘: {formatFullDate(today)}

인증: {isAuthenticated ? "✅" : "❌"}

useCategories 훅

{categoriesLoading ? "로딩 중..." : `${categories?.length || 0}개 카테고리`}

{categories && (
{categories.map((c) => ( {c.name} ))}
)}

useCalendar 훅

현재: {calendar.year}년 {calendar.monthName}

선택: {calendar.selectedDate}

멤버 데이터

{membersLoading ? "로딩 중..." : `${members?.length || 0}명`}

{members && (
{members.map((m) => ( {m.name} ))}
)}
{/* 토스트 표시 */}
{toasts.map((toast) => (
{toast.message}
))}
} />
); } export default App;