import Link from "next/link"; import Image from "next/image"; import { createClient } from "@/lib/supabase/server"; import { addDays, formatDateLong, formatPrice, mondayOf, WEEKDAYS, } from "@/lib/menu"; import { logoUrl } from "@/lib/types"; import type { CodeItem, MenuEntry, Section } from "@/lib/types"; export default async function Home({ searchParams, }: { searchParams: Promise<{ woche?: string }>; }) { const { woche } = await searchParams; const monday = mondayOf(woche); const friday = addDays(monday, 4); const days = WEEKDAYS.map((weekday, i) => ({ weekday, iso: addDays(monday, i), })); const supabase = await createClient(); const [sectionsRes, entriesRes, allergensRes, additivesRes, settingsRes] = await Promise.all([ supabase.from("sections").select("*").order("sort"), supabase .from("menu_entries") .select("id, menu_date, section_key, position, dish:dishes(id, name, price)") .gte("menu_date", monday) .lte("menu_date", friday) .order("position") .order("created_at"), supabase.from("allergens").select("*").order("sort"), supabase.from("additives").select("*").order("sort"), supabase.from("settings").select("logo_path").eq("id", 1).maybeSingle(), ]); const sections = (sectionsRes.data ?? []) as Section[]; const entries = (entriesRes.data ?? []) as unknown as MenuEntry[]; const allergens = (allergensRes.data ?? []) as CodeItem[]; const additives = (additivesRes.data ?? []) as CodeItem[]; const logo = logoUrl(settingsRes.data?.logo_path); const cell = (iso: string, sectionKey: string) => entries.filter((e) => e.menu_date === iso && e.section_key === sectionKey); return (
{/* Kopfbereich: Logo zentriert, Login-Link rechts */}
{logo ? ( // eslint-disable-next-line @next/next/no-img-element Logo ) : (

Speisekarte

)}
Anmelden
{/* Wochen-Navigation */}
← Vorherige Woche Nächste Woche →
{/* Speisekarte */} ))} {sections.map((s) => ( {days.map((d) => ( ))} ))}
{days.map((d) => ( {d.weekday}
{formatDateLong(d.iso)}
{s.label}
{s.time_range}
{cell(d.iso, s.key).map((e) => (
{e.dish.name} {" – "} {formatPrice(e.dish.price)}
))}
{/* Allergene & Zusatzstoffe (gelten für die komplette Speisekarte) */}

Allergene

    {allergens.map((a) => (
  • {a.code} – {a.name}
  • ))}

Zusatzstoffe

    {additives.map((a) => (
  • {a.code} – {a.name}
  • ))}
); }