"use client"; import Link from "next/link"; import { usePathname, useRouter } from "next/navigation"; import { useEffect, useRef, useState } from "react"; import { createClient } from "@/lib/supabase/client"; import { LaurelWreath } from "@/components/laurel-wreath"; import { Avatar } from "@/components/avatar"; import { AgoraLogo } from "@/components/agora-logo"; import { IconWheel, IconScroll, IconPerson, IconColumn, IconLogout, IconChevronDown, IconCalendar, } from "@/components/icons"; type MenuEntry = { href: string; label: string; icon: React.ReactNode; }; function MenuLink({ entry, isActive, onNavigate, }: { entry: MenuEntry; isActive: boolean; onNavigate: () => void; }) { return ( {entry.icon} {entry.label} ); } export function Header({ pseudo, avatarUrl, isJudge, points, }: { pseudo: string; avatarUrl: string | null; isJudge: boolean; points: number; }) { const router = useRouter(); const pathname = usePathname(); const [menuOpen, setMenuOpen] = useState(false); const [signingOut, setSigningOut] = useState(false); const menuRef = useRef(null); useEffect(() => { function handleClickOutside(event: MouseEvent) { if (menuRef.current && !menuRef.current.contains(event.target as Node)) { setMenuOpen(false); } } function handleKeyDown(event: KeyboardEvent) { if (event.key === "Escape") setMenuOpen(false); } document.addEventListener("mousedown", handleClickOutside); document.addEventListener("keydown", handleKeyDown); return () => { document.removeEventListener("mousedown", handleClickOutside); document.removeEventListener("keydown", handleKeyDown); }; }, []); async function handleSignOut() { setSigningOut(true); const supabase = createClient(); await supabase.auth.signOut(); router.push("/login"); router.refresh(); } const entries: MenuEntry[] = [ { href: "/leaderboard", label: "Le Classement", icon: }, { href: "/roulette", label: "La Roulette", icon: }, { href: "/calendrier", label: "Le Calendrier des Dieux", icon: }, { href: "/journal", label: "Le Crieur", icon: }, { href: "/profile", label: "Mon profil", icon: }, ]; if (isJudge) { entries.push({ href: "/admin", label: "Le Conseil des Archontes", icon: , }); } return ( L'Agora setMenuOpen((open) => !open)} aria-expanded={menuOpen} aria-label="Ouvrir le menu" className="flex items-center gap-1.5 rounded-full py-1 pr-1 pl-1.5 transition-colors hover:bg-marble/10 sm:gap-2 sm:pr-1.5" > {pseudo} {points} {menuOpen && ( {entries.map((entry) => ( setMenuOpen(false)} /> ))} {signingOut ? "…" : "Se déconnecter"} )} ); }