"use client"; import { useEffect, ReactNode } from "react"; import { useRouter } from "next/navigation"; import { useAuth } from "@/hooks/useAuth"; import { Loader2 } from "lucide-react"; interface AuthGuardProps { children: ReactNode; requireAuth?: boolean; requireAdmin?: boolean; redirectTo?: string; fallback?: ReactNode; } /** * 인증 보호 컴포넌트 * 로그인 상태 및 권한에 따라 접근을 제어 * - 토큰 갱신/401 처리는 client.ts 인터셉터가 담당 * - 이 컴포넌트는 인증 상태 기반 라우팅 가드 역할만 수행 */ export function AuthGuard({ children, requireAuth = true, requireAdmin = false, redirectTo = "/login", fallback, }: AuthGuardProps) { const { isLoggedIn, isAdmin, loading } = useAuth(); const router = useRouter(); useEffect(() => { if (loading) return; // 토큰이 있는데 아직 인증 확인 중이면 대기 if (typeof window !== "undefined") { const token = localStorage.getItem("authToken"); if (token && !isLoggedIn && !loading) { return; } } if (requireAuth && !isLoggedIn) { router.push(redirectTo); return; } if (requireAdmin && !isAdmin) { router.push(redirectTo); return; } }, [requireAuth, requireAdmin, loading, isLoggedIn, isAdmin, redirectTo, router]); if (loading) { return ( fallback || (
로딩 중...
인증 확인 중...
관리자 권한이 필요합니다.