'use client'; import { memo, useEffect } from 'react'; import { usePathname, useRouter } from 'next/navigation'; import { useAuth } from '@/lib/hooks/useAuth'; import Sidebar from '@/components/ui/shared/Sidebar'; import { ThemeToggle } from '@/components/ui/shared/ThemeToggle'; import { DashboardAccountMenu } from '@/components/ui/dashboard/DashboardAccountMenu'; import { canAccessAppointmentsSection, firstAccessibleDashboardPath, getRequiredReadPermissionForPath, hasPermission, } from '@/components/shared/permissions'; export default function DashboardLayout({ children }: { children: React.ReactNode }) { const { user, currentOrganization, isAuthReady } = useAuth(); const router = useRouter(); const pathname = usePathname(); // ✅ AUTH GUARD (runs once per navigation group) useEffect(() => { if (!isAuthReady) return; if (!user) { router.replace('/login'); return; } if (!currentOrganization) { router.replace('/select-organization'); return; } const required = getRequiredReadPermissionForPath(pathname); if (required) { const allowed = hasPermission(currentOrganization, required) || (required === 'TAB_APPOINTMENTS_READ' && canAccessAppointmentsSection(currentOrganization)); if (!allowed) { router.replace(firstAccessibleDashboardPath(currentOrganization)); } } }, [isAuthReady, user, currentOrganization, router, pathname]); // ✅ LOADING ONLY FOR INITIAL LOAD if (!isAuthReady) { return (
Loading app...
); } if (!user || !currentOrganization) { return (
Loading workspace...
); } return (
{children}
); } const DashboardHeader = memo(function DashboardHeader({ organizationName, }: { organizationName: string; }) { return (

{organizationName}

); });