import { useState } from 'react'; import { NavLink, Outlet, useNavigate } from 'react-router'; import { useAuth } from '../auth/AuthContext'; import { APP_PHASE, APP_VERSION } from '../config/version'; import { Icon } from '../components/Icon'; import type { IconName } from '../components/Icon'; interface NavItem { to: string; label: string; icon: IconName; permission?: string; } const operational: NavItem[] = [ { to: '/', label: 'Inicio', icon: 'home', permission: 'dashboard.read' }, { to: '/inspecciones', label: 'Inspecciones', icon: 'clipboard', permission: 'inspections.read' }, ]; const followUp: NavItem[] = [ { to: '/seguimiento-actas', label: 'Seguimiento de actas', icon: 'clipboard', permission: 'inspection_acts.read' }, { to: '/hallazgos', label: 'Hallazgos', icon: 'alert', permission: 'inspection_findings.read' }, ]; const documents: NavItem[] = [ { to: '/actas', label: 'Actas', icon: 'clipboard', permission: 'inspection_acts.read' }, { to: '/informes', label: 'Informes', icon: 'audit', permission: 'inspection_reports.read' }, ]; const master: NavItem[] = [ { to: '/inventarios', label: 'Inventarios', icon: 'layers', permission: 'assets.read' }, { to: '/mapa', label: 'Mapa', icon: 'map', permission: 'assets.read' }, ]; const administration: NavItem[] = [ { to: '/admin/users', label: 'Usuarios', icon: 'users', permission: 'users.read' }, { to: '/admin/roles', label: 'Roles y permisos', icon: 'shield', permission: 'roles.read' }, { to: '/admin/asset-types', label: 'Configuración de Inventarios', icon: 'layers', permission: 'asset_types.read' }, { to: '/admin/finding-catalog', label: 'Catálogo de hallazgos', icon: 'alert', permission: 'finding_catalog.manage' }, { to: '/admin/document-delivery', label: 'Entrega documental', icon: 'audit', permission: 'document_delivery.read' }, ]; const system: NavItem[] = [ { to: '/admin/audit', label: 'Auditoría', icon: 'audit', permission: 'audit.read' }, ]; export function AppLayout() { const { user, hasPermission, logout } = useAuth(); const navigate = useNavigate(); const [mobileOpen, setMobileOpen] = useState(false); const canSee = (item: NavItem) => !item.permission || hasPermission(item.permission); const close = () => setMobileOpen(false); const handleLogout = async () => { await logout().catch(() => undefined); navigate('/login', { replace: true }); }; const renderItems = (items: NavItem[]) => items.filter(canSee).map((item) => ( isActive ? 'nav-link active' : 'nav-link'} > {item.label} )); const hasFollowUp = followUp.some(canSee); const hasDocuments = documents.some(canSee); const hasMaster = master.some(canSee); const hasAdmin = administration.some(canSee); const hasSystem = system.some(canSee); return (
{mobileOpen &&
DH Inspección v{APP_VERSION}
); }