import { Breadcrumbs } from '@/components/breadcrumbs'; import { Icon } from '@/components/icon'; import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { NavigationMenu, NavigationMenuItem, NavigationMenuList, navigationMenuTriggerStyle, } from '@/components/ui/navigation-menu'; import { UserMenuContent } from '@/components/user-menu-content'; import { useAppearance } from '@/hooks/use-appearance'; import { useInitials } from '@/hooks/use-initials'; import { useMobileNavigation } from '@/hooks/use-mobile-navigation'; import { cn } from '@/lib/utils'; import { dashboard, logout } from '@/routes'; import { type BreadcrumbItem, type NavItem, type SharedData } from '@/types'; import { Link, router, usePage } from '@inertiajs/react'; import { LayoutGrid, LogOut, Menu, Moon, Settings, Sun, X } from 'lucide-react'; import { useEffect, useState } from 'react'; import AppLogo from './app-logo'; import AppLogoIcon from './app-logo-icon'; const mainNavItems: NavItem[] = [ { title: 'Tableau de Bord', href: dashboard(), icon: LayoutGrid, }, ]; interface AppHeaderProps { breadcrumbs?: BreadcrumbItem[]; } export function AppHeader({ breadcrumbs = [] }: AppHeaderProps) { const page = usePage(); const { auth } = page.props; const getInitials = useInitials(); const cleanup = useMobileNavigation(); const { appearance, updateAppearance } = useAppearance(); const [isMenuOpen, setIsMenuOpen] = useState(false); const toggleAppearance = () => { updateAppearance(appearance === 'dark' ? 'light' : 'dark'); }; const closeMenu = () => setIsMenuOpen(false); const handleLogout = () => { cleanup(); router.flushAll(); }; useEffect(() => { return router.on('navigate', closeMenu); }, []); useEffect(() => { const handleKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') closeMenu(); }; document.addEventListener('keydown', handleKeyDown); return () => document.removeEventListener('keydown', handleKeyDown); }, []); useEffect(() => { document.body.style.overflow = isMenuOpen ? 'hidden' : ''; return () => { document.body.style.overflow = ''; }; }, [isMenuOpen]); return ( <>
{/* Logo */} {/* Desktop nav */}
{mainNavItems.map((item, index) => ( {item.icon && } {item.title} {page.url === (typeof item.href === 'string' ? item.href : item.href.url) && (
)} ))}
{/* Right actions */}
{/* Theme toggle — desktop only */} {/* Avatar dropdown — always visible */} {/* Hamburger — mobile only */}
{/* Mobile menu */} {isMenuOpen && ( <>