import React, { useEffect, useRef } from 'react'; import { Link, NavLink } from 'react-router-dom'; import { useAuth } from '../context/useAuth'; import { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarHeader, SidebarMenu, SidebarMenuButton, SidebarMenuItem, useSidebar, } from '@/components/ui/sidebar'; import { User, Clock, CalendarDays, Users, LogOut, Wheat, } from 'lucide-react'; const NavBar = () => { const { user, logout } = useAuth(); const { isMobile, toggleSidebar, setOpen } = useSidebar(); const closeTimeout = useRef(null); useEffect(() => { return () => { if (closeTimeout.current) { clearTimeout(closeTimeout.current); } }; }, []); if (!user) { return null; } const handleMouseEnter = () => { if (isMobile) return; if (closeTimeout.current) { clearTimeout(closeTimeout.current); closeTimeout.current = null; } setOpen(true); }; const handleMouseLeave = () => { if (isMobile) return; closeTimeout.current = setTimeout(() => { setOpen(false); }, 150); }; const handleCloseMenu = () => { if (isMobile) { toggleSidebar(); } }; const navigation = [ { title: 'Profil', href: '/profile', icon: User, }, { title: 'Résumé hebdomadaire', href: '/weekly-summary', icon: Clock, }, { title: 'Pointage', href: '/pointage', icon: CalendarDays, }, ]; /* * Hauteur d'une ligne de navigation. * * Le SidebarMenuButton natif fait 32px. * On lui donne une ligne de 48px et on le centre. * * Le header de groupe fait lui aussi 32px. * En mode plié, il est remplacé visuellement par * une séparation, mais conserve exactement ses 32px. */ const menuItemClass = 'h-12 min-h-12 flex items-center'; const buttonClass = ` w-full h-8 min-h-8 group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! `; const linkClass = ` flex h-full w-full items-center gap-2 text-base `; /* * Header de groupe : * * Déplié : * [ Navigation ] 32px * * Plié : * [ ---------------------- ] 32px * * Même hauteur dans les deux cas. */ const GroupHeader = ({ children }) => (