"use client"; import { useEffect, useState } from "react"; import { usePathname, useRouter } from "next/navigation"; import { DashboardLayout } from "./DashboardLayout"; import { useAuthStore } from "@/lib/stores/authStore"; import { useThemeStore } from "@/lib/stores/themeStore"; import { useLanguageStore } from "@/lib/stores/languageStore"; import { Loader2, Sparkles } from "lucide-react"; const PUBLIC_PATHS = ["/login"]; // Lang codes mapped to BCP-47 HTML lang values const LANG_MAP: Record = { en: "en", hi: "hi", mr: "mr", }; function FullPageSpinner() { return (

Loading BankBot AI...

); } export function AppShell({ children }: { children: React.ReactNode }) { const pathname = usePathname(); const router = useRouter(); const { isAuthenticated, restoreSession } = useAuthStore(); const { theme, setTheme } = useThemeStore(); const { language } = useLanguageStore(); const [hydrated, setHydrated] = useState(false); const isPublic = PUBLIC_PATHS.includes(pathname); // Apply persisted theme on mount useEffect(() => { setTheme(theme); restoreSession().finally(() => setHydrated(true)); }, []); // eslint-disable-line react-hooks/exhaustive-deps // Sync whenever language changes useEffect(() => { if (typeof document !== "undefined") { document.documentElement.lang = LANG_MAP[language] ?? language; } }, [language]); if (!hydrated) return ; if (isPublic) return <>{children}; if (!isAuthenticated) { router.replace("/login"); return ; } return {children}; }