"use client"; import { ArrowRightStartOnRectangleIcon, CalendarDaysIcon, ChartBarIcon, BellAlertIcon, BoltIcon, ChevronRightIcon, ChevronUpDownIcon, Cog6ToothIcon, DevicePhoneMobileIcon, FireIcon, MoonIcon, ScaleIcon, ShoppingCartIcon, SparklesIcon, SunIcon, UserIcon, UsersIcon, } from "@heroicons/react/24/outline"; import Link from "next/link"; import { usePathname, useRouter } from "next/navigation"; import { useEffect, useRef, useState } from "react"; import { signOut, useSession } from "@/lib/auth-client"; import { useTheme } from "./theme-provider"; type NavItem = { href?: string; label: string; icon: React.ComponentType<{ className?: string }>; disabled?: boolean; hint?: string; }; type NavGroup = { label: string; items: NavItem[]; }; const navGroups: NavGroup[] = [ { label: "Heute", items: [ { href: "/", label: "Tagesansicht", icon: CalendarDaysIcon }, { href: "/wochenbudget", label: "Wochenbudget", icon: ChartBarIcon }, { href: "/statistiken", label: "Statistiken", icon: ChartBarIcon }, { href: "/erinnerungen", label: "Erinnerungen", icon: BellAlertIcon }, { href: "/aktivitaeten", label: "Aktivitäten", icon: BoltIcon }, { href: "/wearables", label: "Wearables", icon: DevicePhoneMobileIcon }, { href: "/hellfireclub", label: "Hellfireclub", icon: FireIcon }, { href: "/gewicht", label: "Gewicht", icon: ScaleIcon }, ], }, { label: "Ernährung", items: [ { href: "/planung", label: "Essensplanung", icon: SparklesIcon }, { href: "/lebensmittel", label: "Lebensmittel", icon: ShoppingCartIcon }, { href: "/maerkte", label: "Märkte", icon: ShoppingCartIcon }, { href: "/rezepte", label: "Rezepte", icon: SparklesIcon }, { href: "/rezepte/pruefung", label: "Rezeptprüfung", icon: SparklesIcon }, { href: "/einkaufsliste", label: "Einkaufsliste", icon: ShoppingCartIcon }, ], }, { label: "System", items: [ { href: "/benutzer", label: "Benutzer", icon: UsersIcon }, { href: "/aktivitaetsfeed", label: "Activity Feed", icon: BellAlertIcon }, { href: "/einstellungen", label: "Einstellungen", icon: Cog6ToothIcon }, { href: "/einstellungen/punkte", label: "Punktevergabe", icon: ChartBarIcon }, ], }, ]; export function Sidebar() { const pathname = usePathname(); const router = useRouter(); const { data: session } = useSession(); const { isDark, toggleDark } = useTheme(); const [menuOpen, setMenuOpen] = useState(false); const [collapsedGroups, setCollapsedGroups] = useState>(new Set()); const menuRef = useRef(null); useEffect(() => { function handleOutside(e: MouseEvent) { if (menuRef.current && !menuRef.current.contains(e.target as Node)) { setMenuOpen(false); } } if (menuOpen) document.addEventListener("mousedown", handleOutside); return () => document.removeEventListener("mousedown", handleOutside); }, [menuOpen]); function toggleGroup(label: string) { setCollapsedGroups((prev) => { const next = new Set(prev); if (next.has(label)) next.delete(label); else next.add(label); return next; }); } const isActive = (href: string) => { if (href === "/") return pathname === "/"; return pathname === href || pathname.startsWith(`${href}/`); }; async function handleSignOut() { await signOut(); if (session?.user?.id) { localStorage.removeItem(`hellth-theme:${session.user.id}`); } document.documentElement.classList.remove("dark"); router.push("/login"); } return ( ); }