import { useEffect, useState } from 'react' import { api } from '../utils/api' export default function NutritionFoodMap({ onChanged }) { const [unmapped, setUnmapped] = useState([]) const [learned, setLearned] = useState([]) const [error, setError] = useState(null) const [query, setQuery] = useState({}) const [hits, setHits] = useState({}) const [saving, setSaving] = useState(null) const load = async () => { try { const [u, m] = await Promise.all([api.listUnmappedFoods(), api.listMyFoodMappings()]) setUnmapped(u) setLearned(m) } catch (e) { setError(e.message) } } useEffect(() => { load() }, []) const search = async (key, q) => { setQuery((s) => ({ ...s, [key]: q })) if (!q || q.length < 2) { setHits((s) => ({ ...s, [key]: [] })) return } try { const rows = await api.searchBlsFoods(q) setHits((s) => ({ ...s, [key]: rows })) } catch (e) { setError(e.message) } } const assign = async (sourceName, foodId, key) => { setSaving(key) setError(null) try { await api.upsertMyFoodMapping({ source_name: sourceName, food_id: foodId }) setHits((s) => ({ ...s, [key]: [] })) await load() onChanged?.() } catch (e) { setError(e.message) } finally { setSaving(null) } } const remove = async (id) => { if (!confirm('Zuordnung wirklich löschen?')) return try { await api.deleteMyFoodMapping(id) await load() onChanged?.() } catch (e) { setError(e.message) } } return (
Lebensmittel zuordnen

Einmal bestätigt, bleibt die Zuordnung erhalten und gilt für spätere Importe. Du kannst sie jederzeit ändern oder löschen. Keine automatische KI-Zuordnung.

{error &&
{error}
}

Offen ({unmapped.length})

{unmapped.length === 0 &&

Keine ungemappten Bezeichner.

} {unmapped.map((u) => { const key = u.source_name_normalized return (
{u.source_name_raw}
{u.count}× · {u.first_date} – {u.last_date}
search(key, e.target.value)} /> {(hits[key] || []).map((h) => ( ))}
) })}

Gelernt ({learned.length})

{learned.map((m) => (
{m.source_name_raw}
→ {m.bls_code ? `${m.bls_code} · ` : ''}{m.food_name_de} {m.catalog_kind !== 'official_bls' ? ' (manuell)' : ''}
))}
) } export function DayMarkButtons({ date, markType, onChanged }) { const setMark = async (type) => { try { if (markType === type) await api.deleteNutritionDayMark(date) else await api.putNutritionDayMark(date, { mark_type: type }) onChanged?.() } catch (e) { alert(e.message) } } return ( ) }