import { useEffect, useState } from 'react' import { api } from '../utils/api' function FileImportBlock({ label, kind, busy, onRun }) { const [file, setFile] = useState(null) return (
setFile(e.target.files?.[0] || null)} /> {file &&

{file.name}

}
) } export default function AdminBlsImportPage() { const [status, setStatus] = useState(null) const [msg, setMsg] = useState(null) const [error, setError] = useState(null) const [busy, setBusy] = useState(false) const load = () => { api.adminBlsStatus().then(setStatus).catch((e) => setError(e.message)) } useEffect(() => { load() }, []) const run = async (kind, file, dry) => { setError(null) setBusy(true) setMsg(dry ? 'Prüfe…' : 'Importiere…') try { const fn = kind === 'components' ? api.adminBlsImportComponents : api.adminBlsImportFoods const res = await fn(file, dry) setMsg(JSON.stringify(res, null, 2)) if (!dry) load() } catch (e) { setError(e.message) setMsg(null) } finally { setBusy(false) } } return (

BLS 4.0 importieren

Offizielle Dateien von blsdb.de (frei verfügbar, MRI). Codes bleiben erhalten. Zuerst Components, dann die Datendatei. Immer zuerst „Prüfen“.

{status && (

{status.official_foods} offizielle Lebensmittel · {status.official_attributes} Stoffe · {status.manual_foods} manuell · {status.source}

)} {error &&

{error}

} {msg &&
{msg}
}
) }