"use client"; // Gemeinsamer Kopfbereich für alle internen Seiten. Statt zweier // getrennter Bereiche (Kantine/Verwaltung) gibt es eine Navigation: // Admins sehen zusätzlich die Verwaltungs-Links, der aktive Punkt // wird hervorgehoben. Ab "sm" die klassische einzeilige Navigation, // darunter ein Hamburger-Menü mit denselben Links gestapelt. import Link from "next/link"; import { usePathname } from "next/navigation"; import { useEffect, useState } from "react"; import type { Role } from "@/lib/types"; import { formatMessage } from "@/lib/i18n/shared"; import { useDict } from "@/components/i18n/LocaleProvider"; import LanguageSwitcher from "@/components/i18n/LanguageSwitcher"; interface NavLink { href: string; label: string; } export default function AppHeader({ role, displayName, }: { role: Role; displayName: string; }) { const pathname = usePathname(); const dict = useDict(); const [suggestionCount, setSuggestionCount] = useState(0); const [mobileOpen, setMobileOpen] = useState(false); useEffect(() => { fetch("/api/dish-suggestions") .then((res) => (res.ok ? res.json() : [])) .then((data) => setSuggestionCount(Array.isArray(data) ? data.length : 0)) .catch(() => {}); }, [pathname]); // Hamburger-Panel bei jeder Navigation automatisch schließen. useEffect(() => { setMobileOpen(false); }, [pathname]); const menuLinks: NavLink[] = [ { href: "/intern", label: dict.header.weekPlan }, { href: "/intern/essenszeiten", label: dict.header.sections }, { href: "/intern/gerichte", label: dict.header.dishes }, { href: "/intern/kennzeichnung", label: dict.header.labels }, { href: "/intern/vorschlaege", label: dict.header.suggestions }, ]; const adminLinks: NavLink[] = [ { href: "/admin", label: dict.header.users }, { href: "/admin/design", label: dict.header.design }, { href: "/admin/sprachen", label: dict.header.languages }, ]; const linkClass = (href: string) => `rounded px-2 py-0.5 transition-colors hover:bg-white/10 ${ pathname === href ? "bg-white/20 font-semibold" : "text-white/90" }`; // Von Desktop- und Mobile-Navigation gemeinsam genutzt, damit die // Vorschläge-Badge-Logik nicht doppelt gepflegt werden muss. function renderLinks(links: NavLink[]) { return links.map((l) => ( {l.label} {l.href === "/intern/vorschlaege" && suggestionCount > 0 && ( {suggestionCount} )} )); } return (
{/* Mobil (< "sm"): kompakte Kopfzeile mit Hamburger-Toggle */}
{dict.header.canteen}
{mobileOpen && (
{role === "admin" && ( )} {dict.header.viewMenu}
{displayName}
)} {/* Ab "sm": bisherige einzeilige Navigation */}
{dict.header.canteen} {role === "admin" && ( )} {dict.header.viewMenu}
{displayName}
); }