"use client"; import { useCallback, useEffect, useMemo, useState } from "react"; import Link from "next/link"; import { createClient } from "@/lib/supabase/client"; import { addDays, dishCodes, entriesFor, formatDateLong, formatPrice, mondayOf, todayISO, } from "@/lib/menu"; import { formatMessage } from "@/lib/i18n/shared"; import { localized } from "@/lib/types"; import type { Dish, MenuEntry, Section } from "@/lib/types"; import { useDict, useLocale } from "@/components/i18n/LocaleProvider"; export default function WeekEditor({ monday }: { monday: string }) { const supabase = useMemo(() => createClient(), []); const dict = useDict(); const locale = useLocale(); const friday = addDays(monday, 4); const days = dict.weekdays.long.map((weekday, i) => ({ weekday, iso: addDays(monday, i), })); const [sections, setSections] = useState([]); const [dishes, setDishes] = useState([]); const [entries, setEntries] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); // Zelle, in der gerade ein Gericht hinzugefügt wird const [adding, setAdding] = useState<{ iso: string; section: string } | null>( null ); const [selectedDish, setSelectedDish] = useState(""); const load = useCallback(async () => { setError(null); const [se, di, en] = await Promise.all([ supabase.from("sections").select("*").order("sort"), supabase.from("dishes").select("*").order("name"), supabase .from("menu_entries") .select( "id, menu_date, section_key, position, dish:dishes(id, name, name_en, name_pl, price, allergens, additives)" ) .gte("menu_date", monday) .lte("menu_date", friday) .order("position") .order("created_at"), ]); const problem = se.error ?? di.error ?? en.error; if (problem) { setError(formatMessage(dict.weekEditor.loadError, { message: problem.message })); } else { setSections(se.data as Section[]); setDishes(di.data as Dish[]); setEntries(en.data as unknown as MenuEntry[]); } setLoading(false); }, [supabase, monday, friday, dict]); useEffect(() => { setLoading(true); load(); }, [load]); async function addEntry() { if (!adding || !selectedDish) return; const { error } = await supabase.from("menu_entries").insert({ menu_date: adding.iso, section_key: adding.section, dish_id: selectedDish, }); if (error) { setError( /duplicate key/i.test(error.message) ? dict.weekEditor.duplicateEntry : formatMessage(dict.weekEditor.saveError, { message: error.message }) ); } setAdding(null); setSelectedDish(""); await load(); } async function removeEntry(id: string) { const { error } = await supabase.from("menu_entries").delete().eq("id", id); if (error) setError(formatMessage(dict.weekEditor.deleteError, { message: error.message })); await load(); } const [hintBefore, hintAfter] = dict.weekEditor.newDishesHint.split("{link}"); return (

{dict.weekEditor.title}

{dict.publicMenu.prevWeek} {dict.publicMenu.today} {dict.publicMenu.nextWeek}
{error && (

{error}

)} {loading ? (

{dict.weekEditor.loading}

) : ( ))} {sections.map((s) => ( {days.map((d) => { const isAdding = adding?.iso === d.iso && adding?.section === s.key; return ( ); })} ))}
{days.map((d) => ( {d.weekday}
{formatDateLong(d.iso, dict.dateLocale)}
{localized(s, locale)}
{s.time_range}
{entriesFor(entries, d.iso, s.key).map((e) => { const codes = dishCodes(e.dish); return (
{localized(e.dish, locale)} {codes && {codes}} {" – "} {formatPrice(e.dish.price)}
); })} {isAdding ? (
) : ( )}
)}

{hintBefore} {dict.weekEditor.newDishesLinkLabel} {hintAfter}

); }