"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
{menuOpen && (
{entries.map((entry) => ( setMenuOpen(false)} /> ))}
)}
); }