import { ChevronDown, LogOut, Moon, Rows3, Sun, User as UserIcon } from "lucide-react"; import { usePathname } from "next/navigation"; import { useTheme } from "next-themes"; import { signOut, useSession } from "next-auth/react"; import { useEffect, useState } from "react"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { useGridStore } from "@/features/grid/store/use-grid-store"; import { pageCourante } from "@/components/shared/navigation"; type Densite = "compact" | "normal" | "comfortable"; /** * En-tête : nom de la page en cours, choix du thème et menu du compte. * * La recherche qui s'y trouvait ne filtrait que la Grille (même depuis les autres * pages, et en silence) : elle est retirée, la Grille garde la sienne. Le nom * affiché est celui de l'utilisateur connecté (il était écrit en dur). */ export function Header() { const pathname = usePathname(); const { resolvedTheme, setTheme } = useTheme(); const { data: session } = useSession(); const displayDensity = useGridStore((s) => s.displayDensity); const setDisplayDensity = useGridStore((s) => s.setDisplayDensity); const [isMounted, setIsMounted] = useState(false); useEffect(() => { // Le thème n'est connu qu'au montage (lu dans le navigateur). // eslint-disable-next-line react-hooks/set-state-in-effect setIsMounted(true); }, []); const isDark = isMounted && resolvedTheme === "dark"; const page = pageCourante(pathname); const nom = session?.user?.name ?? ""; const role = (session?.user as { role?: string } | undefined)?.role === "admin" ? "Administrateur" : "Utilisateur"; const initiale = nom.trim().charAt(0).toUpperCase() || "?"; return (
{page && (

{page.label}

)}
{nom || "Compte"} {role} Hauteur des lignes de la Grille setDisplayDensity(v as Densite)} > Compacte Normale Aérée { await signOut({ redirect: false }); window.location.href = "/login"; }} > Se déconnecter
); }