'use client'; import { useEffect, useState } from 'react'; import Link from 'next/link'; import { usePathname, useRouter } from 'next/navigation'; import { AuthProvider, useAuth } from '@/features/auth/components/AuthProvider'; import { visibleNavItems, type NavItem } from '@/lib/permissions'; import type { Role } from '@/types'; const SIDEBAR_STORAGE_KEY = 'mdv.admin.sidebar.collapsed'; const SIDEBAR_ID = 'admin-sidebar'; interface SidebarToggleProps { expanded: boolean; onToggle: () => void; mode: 'desktop' | 'mobile'; } function SidebarToggle({ expanded, onToggle, mode }: SidebarToggleProps) { const label = mode === 'mobile' ? expanded ? 'Cerrar menú de navegación' : 'Abrir menú de navegación' : expanded ? 'Colapsar menú lateral' : 'Expandir menú lateral'; return ( ); } function NavItemRow({ item, collapsed, onNavigate }: { item: NavItem; collapsed: boolean; onNavigate: () => void }) { const pathname = usePathname(); const active = item.href === '/' ? pathname === '/' : pathname.startsWith(item.href); return ( {item.label} {item.badge != null && item.badge > 0 && ( {item.badge} )} ); } interface SidebarProps { role: Role; email: string; collapsed: boolean; mobileOpen: boolean; onCloseMobile: () => void; onLogout: () => void; } function Sidebar({ role, email, collapsed, mobileOpen, onCloseMobile, onLogout }: SidebarProps) { const items = visibleNavItems(role); return ( ); } function DashboardShell({ children }: { children: React.ReactNode }) { const { user, loading, logout } = useAuth(); const router = useRouter(); const pathname = usePathname(); const [desktopCollapsed, setDesktopCollapsed] = useState(false); const [mobileOpen, setMobileOpen] = useState(false); useEffect(() => { if (!loading && !user) router.push('/login'); }, [user, loading, router]); useEffect(() => { setDesktopCollapsed(localStorage.getItem(SIDEBAR_STORAGE_KEY) === 'true'); }, []); useEffect(() => { setMobileOpen(false); }, [pathname]); useEffect(() => { if (!mobileOpen) return; const onKeyDown = (event: KeyboardEvent) => { if (event.key === 'Escape') setMobileOpen(false); }; document.addEventListener('keydown', onKeyDown); return () => document.removeEventListener('keydown', onKeyDown); }, [mobileOpen]); const toggleDesktop = () => { setDesktopCollapsed((current) => { const next = !current; localStorage.setItem(SIDEBAR_STORAGE_KEY, String(next)); return next; }); }; if (loading) { return (
Cargando...
); } if (!user) return null; return (
{mobileOpen && (
); } export default function DashboardLayout({ children }: { children: React.ReactNode }) { return ( {children} ); }