import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; import { LogOut, Monitor, Moon, Sun } from 'lucide-react'; import { useState, type ReactNode } from 'react'; import { Navigate, NavLink, useNavigate } from 'react-router-dom'; import { getToken } from '@/api/client'; import { useDemoAccounts, useDemoLogin, useLogout, useMe } from '@/auth/use-auth'; import { Avatar, initialsOf } from '@/components/avatar'; import { Logo } from '@/components/logo'; import { IcoAscenseurs, IcoDemandes, IcoFichiers, IcoOrdresDeTravail, IcoPersonnes, IcoPreventif, IcoRecherche, IcoSites, IcoStatistiques, IcoStock, IcoTableauDeBord, IcoTiers, } from '@/components/nav-icons'; import { applyThemeMode, getThemeMode, nextThemeMode, THEME_LABELS, type ThemeMode, } from '@/theme/theme'; /** Navigation de la maquette validée. Les écrans à venir restent visibles * (périmètre annoncé) mais inertes, marqués de leur release. */ const NAVIGATION: { groupe: string; liens: { libelle: string; icone: () => ReactNode; route?: string; release?: string }[]; }[] = [ { groupe: 'Exploitation', liens: [ { libelle: 'Tableau de bord', icone: IcoTableauDeBord, route: '/' }, { libelle: 'Ordres de travail', icone: IcoOrdresDeTravail, release: 'R2' }, { libelle: 'Demandes', icone: IcoDemandes, release: 'R2' }, { libelle: 'Préventif', icone: IcoPreventif, release: 'R2' }, ], }, { groupe: 'Parc', liens: [ { libelle: 'Ascenseurs', icone: IcoAscenseurs, release: 'R1' }, { libelle: 'Sites', icone: IcoSites, release: 'R1' }, ], }, { groupe: 'Ressources', liens: [ { libelle: 'Stock & achats', icone: IcoStock, release: 'R3' }, { libelle: 'Tiers', icone: IcoTiers, release: 'R3' }, { libelle: 'Fichiers', icone: IcoFichiers, release: 'R3' }, ], }, { groupe: 'Pilotage', liens: [ { libelle: 'Statistiques', icone: IcoStatistiques, release: 'R3' }, { libelle: 'Personnes', icone: IcoPersonnes, release: 'R1' }, ], }, ]; const THEME_ICONS: Record = { auto: Monitor, light: Sun, dark: Moon, }; export function Coquille({ children }: { children: ReactNode }) { const navigate = useNavigate(); const { data: me } = useMe(); const { data: demoAccounts } = useDemoAccounts(); const demoLogin = useDemoLogin(); const logout = useLogout(); const [themeMode, setThemeMode] = useState(getThemeMode); if (!getToken()) return ; const cyclerTheme = () => { const mode = nextThemeMode(themeMode); applyThemeMode(mode); setThemeMode(mode); }; const basculerDemo = (userId: string) => { if (userId === me?.id) return; demoLogin.mutate(userId, { onSuccess: () => navigate('/', { replace: true }) }); }; const IconeTheme = THEME_ICONS[themeMode]; return (
{demoAccounts && demoAccounts.length > 0 ? ( <>
Changer de rôle (démo)
{demoAccounts.map((compte) => ( basculerDemo(compte.id)} > {compte.displayName} {compte.roleName} ))}
) : null} Se déconnecter
{children}
); }