"use client"; // Pflege der globalen Allergen-/Zusatzstofflisten, die unterhalb // der öffentlichen Speisekarte angezeigt werden. import { useCallback, useEffect, useMemo, useState } from "react"; import { createClient } from "@/lib/supabase/client"; import type { CodeItem } from "@/lib/types"; export default function CodeListManager({ table, title, codeLabel, }: { table: "allergens" | "additives"; title: string; codeLabel: string; }) { const supabase = useMemo(() => createClient(), []); const [items, setItems] = useState([]); const [editing, setEditing] = useState<{ original: string | null; // code vor der Bearbeitung, null = neu code: string; name: string; } | null>(null); const [error, setError] = useState(null); const load = useCallback(async () => { const { data, error } = await supabase.from(table).select("*").order("sort"); if (error) setError(`Laden fehlgeschlagen: ${error.message}`); else setItems(data as CodeItem[]); }, [supabase, table]); useEffect(() => { load(); }, [load]); async function save(e: React.FormEvent) { e.preventDefault(); if (!editing) return; setError(null); const code = editing.code.trim(); const name = editing.name.trim(); if (!code || !name) return; let dbError; if (editing.original) { ({ error: dbError } = await supabase .from(table) .update({ code, name }) .eq("code", editing.original)); } else { const maxSort = items.reduce((m, i) => Math.max(m, i.sort), 0); ({ error: dbError } = await supabase .from(table) .insert({ code, name, sort: maxSort + 1 })); } if (dbError) { setError( /duplicate key/i.test(dbError.message) ? `Das Kürzel „${code}“ existiert bereits.` : `Speichern fehlgeschlagen: ${dbError.message}` ); return; } setEditing(null); await load(); } async function remove(item: CodeItem) { if (!window.confirm(`„${item.code} – ${item.name}“ wirklich löschen?`)) return; const { error } = await supabase.from(table).delete().eq("code", item.code); if (error) setError(`Löschen fehlgeschlagen: ${error.message}`); await load(); } return (

{title}

{error && (

{error}

)} {editing && (
setEditing({ ...editing, code: e.target.value })} required />
setEditing({ ...editing, name: e.target.value })} required />
)}
    {items.map((item) => (
  • {item.code} – {item.name}
  • ))} {items.length === 0 && (
  • Keine Einträge.
  • )}
); }