"use client"; import { ChevronLeft, ChevronRight, Package } from "lucide-react"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { useEffect, useState } from "react"; import { useSession } from "next-auth/react"; import { cn } from "@/lib/utils"; import { useGridStore } from "@/features/grid/store/use-grid-store"; import { NAV_GROUPS } from "@/components/shared/navigation"; import { Tooltip } from "@/components/ui/tooltip"; const CLE_STOCKAGE = "sidebar_expanded"; /** * Menu principal : groupé par usage, déplié par défaut (libellés visibles). * Le compte utilisateur et la déconnexion sont dans l'en-tête. */ export function Sidebar() { const pathname = usePathname(); const { data: session } = useSession(); const activeGridQuery = useGridStore((s) => s.activeGridQuery); const [isMounted, setIsMounted] = useState(false); const [isExpanded, setIsExpanded] = useState(true); useEffect(() => { // `isMounted` évite un écart d'hydratation (préférence lue dans le navigateur). // eslint-disable-next-line react-hooks/set-state-in-effect setIsMounted(true); try { // Seul un repli explicite est mémorisé : par défaut, le menu est déplié. if (localStorage.getItem(CLE_STOCKAGE) === "false") setIsExpanded(false); } catch { /* stockage indisponible : on garde le menu déplié */ } }, []); const toggleSidebar = () => { const next = !isExpanded; setIsExpanded(next); try { localStorage.setItem(CLE_STOCKAGE, String(next)); } catch { /* préférence non mémorisée, sans conséquence */ } }; const isAdmin = (session?.user as { role?: string } | undefined)?.role === "admin"; const groupes = NAV_GROUPS .map((g) => ({ ...g, items: g.items.filter((i) => !i.adminOnly || isAdmin) })) .filter((g) => g.items.length > 0); return ( ); }