"use client"; import { useEffect, useState } from "react"; import { usePathname, useRouter } from "next/navigation"; import { useAuthStore } from "@/stores/authStore"; import { Sidebar } from "./Sidebar"; const PUBLIC_PATHS = ["/login", "/register"]; export function AuthGuard({ children }: { children: React.ReactNode }) { const router = useRouter(); const pathname = usePathname(); const token = useAuthStore((s) => s.token); // Zustand persist hydrates asynchronously — wait for it before rendering const [hydrated, setHydrated] = useState(false); useEffect(() => { setHydrated(true); }, []); useEffect(() => { if (!hydrated) return; if (!token && !PUBLIC_PATHS.includes(pathname)) { router.replace("/login"); } }, [hydrated, token, pathname, router]); if (!hydrated) return null; // Public pages (login/register) render without the app shell if (PUBLIC_PATHS.includes(pathname)) { return <>{children}; } // Not logged in yet — blank while redirecting if (!token) return null; // Authenticated: render the full app shell return (
{children}
); }