"use client"; import { useRouter } from "next/navigation"; import { type ReactNode, useCallback, useEffect, useId, useState } from "react"; import Sidebar from "@/components/Sidebar"; import { authClient } from "@/lib/auth/client"; export default function DashboardLayout({ children }: { children: ReactNode }) { const mainContentId = useId(); const { data, isPending } = authClient.useSession(); const router = useRouter(); const [isSidebarExpanded, setIsSidebarExpanded] = useState(true); const [isMobile, setIsMobile] = useState(false); useEffect(() => { const updateStatesBasedOnScreen = () => { const screenIsMobile = window.innerWidth < 640; // sm breakpoint for mobile const screenIsSmallDesktop = window.innerWidth < 768 && !screenIsMobile; // between sm and md setIsMobile(screenIsMobile); setIsSidebarExpanded(!screenIsSmallDesktop && !screenIsMobile); }; updateStatesBasedOnScreen(); window.addEventListener("resize", updateStatesBasedOnScreen); return () => window.removeEventListener("resize", updateStatesBasedOnScreen); }, []); // Toggle sidebar handler - used for clicking the toggle button const toggleSidebarHandler = useCallback(() => { setIsSidebarExpanded((prev) => !prev); }, []); // Collapse sidebar handler - used when clicking navigation links on mobile const collapseSidebar = useCallback(() => { if (isMobile) { setIsSidebarExpanded(false); } }, [isMobile]); // Redirect handled by middleware, but show loading state if (isPending) { return (
Loading session...
); } // If no session after loading, redirect to sign-in if (!data?.session) { router.push("/auth/sign-in"); return (
Redirecting to login...
); } return (
{children}
); }