"use client"; import { useEffect, useRef, useState } from "react"; import Link from "next/link"; import type { SessionUser } from "@/lib/auth"; /** * Nutzermenü mit Initialen-Avatar. * Bewusst ohne Menü-Bibliothek: ein
-loses Popover mit Escape- und * Außenklick-Behandlung reicht und bleibt tastaturbedienbar. */ export function UserMenu({ user }: { user: SessionUser }) { const [open, setOpen] = useState(false); const ref = useRef(null); useEffect(() => { if (!open) return; const onPointer = (event: MouseEvent) => { if (!ref.current?.contains(event.target as Node)) setOpen(false); }; const onKey = (event: KeyboardEvent) => { if (event.key === "Escape") setOpen(false); }; document.addEventListener("mousedown", onPointer); document.addEventListener("keydown", onKey); return () => { document.removeEventListener("mousedown", onPointer); document.removeEventListener("keydown", onKey); }; }, [open]); const initials = user.name .split(/\s+/) .filter(Boolean) .slice(0, 2) .map((part) => part[0]?.toUpperCase() ?? "") .join(""); return (
{open && (

{user.name}

{user.email}

setOpen(false)}> Einstellungen setOpen(false)}> Benachrichtigungen setOpen(false)}> API-Schlüssel setOpen(false)}> Papierkorb {user.role === "ADMIN" && ( setOpen(false)}> Verwaltung )}
)}
); } function MenuLink({ href, onClick, children, }: { href: string; onClick: () => void; children: React.ReactNode; }) { return ( {children} ); }