"use client"; import { useEffect } from "react"; import { useRouter } from "next/navigation"; import { useAuth } from "@/lib/auth/auth-context"; import { IS_MOCK_AUTH_MODE } from "@/lib/config"; import { AppHeader } from "@/components/layout/AppHeader"; import { AppSidebar } from "@/components/layout/AppSidebar"; import { SidebarProvider, useSidebar } from "@/components/layout/SidebarContext"; import { ChatOverlay } from "@/components/chat"; import { MosaicSpinner } from "@/components/ui/MosaicSpinner"; import type { ReactNode } from "react"; // --------------------------------------------------------------------------- // Constants // --------------------------------------------------------------------------- const SIDEBAR_EXPANDED_WIDTH = "240px"; const SIDEBAR_COLLAPSED_WIDTH = "60px"; // --------------------------------------------------------------------------- // Inner shell — must be a child of SidebarProvider to use useSidebar // --------------------------------------------------------------------------- interface AppShellProps { children: ReactNode; } function AppShell({ children }: AppShellProps): React.JSX.Element { const { collapsed, isMobile } = useSidebar(); // On tablet (md–lg), hide sidebar from the grid when the sidebar is collapsed. // On mobile, the sidebar is fixed-position so the grid is always single-column. const sidebarHidden = !isMobile && collapsed; return (
{/* Full-width header — grid-column: 1 / -1 via .app-header CSS class */} {/* Sidebar — left column, row 2, via .app-sidebar CSS class */} {/* Main content — right column, row 2, via .app-main CSS class */}
{IS_MOCK_AUTH_MODE && (
Mock Auth Mode (Local Only): Real authentication is bypassed for frontend development.
)}
{children}
{!IS_MOCK_AUTH_MODE && }
); } // --------------------------------------------------------------------------- // Authenticated layout — handles auth guard + provides sidebar context // --------------------------------------------------------------------------- export default function AuthenticatedLayout({ children, }: { children: ReactNode; }): React.JSX.Element | null { const router = useRouter(); const { isAuthenticated, isLoading } = useAuth(); useEffect(() => { if (!isLoading && !isAuthenticated) { router.push("/login"); } }, [isAuthenticated, isLoading, router]); if (isLoading) { return ; } if (!isAuthenticated) { return null; } return ( {children} ); }