import { useState } from 'react'; import { api } from '../../api.js'; import { ceil2, fmtItems, fmtQty, parseQty } from '../../units.js'; import ProductInput from './ProductInput.jsx'; import UnitSelect from './UnitSelect.jsx'; const PEOPLE_KEY = 'p42.rezeptPersonen'; const UNIT_LABELS = { el: 'EL', tl: 'TL', pck: 'Pck.', msp: 'Msp.', stk: 'Stk.', liter: 'l', gr: 'g' }; const unitLabel = (u) => UNIT_LABELS[u] || (u.length > 2 ? u[0].toUpperCase() + u.slice(1) : u); // Rezeptmengen, die sich in kg bzw. l umrechnen lassen const CONVERT = { g: ['kg', 0.001], gr: ['kg', 0.001], gramm: ['kg', 0.001], mg: ['kg', 0.000001], kg: ['kg', 1], ml: ['l', 0.001], cl: ['l', 0.01], dl: ['l', 0.1], l: ['l', 1], liter: ['l', 1], }; const fmt = (n) => (n >= 10 ? Math.round(n) : Math.round(n * 10) / 10).toLocaleString('de-DE'); function loadPeople() { try { return Number(localStorage.getItem(PEOPLE_KEY)) || null; } catch { return null; } } /** * Rezept abgleichen: Zutaten laden, auf Personenzahl umrechnen, mit dem Vorrat vergleichen * und Fehlendes in den Einkauf der gewählten Liste setzen. find(list, name) sucht in Vorrat bzw. Einkauf dieser Liste. */ export default function RecipeCheck({ products, find, shoppingList, onTakeOver, busy }) { const [mode, setMode] = useState('url'); // url | text const [url, setUrl] = useState(''); const [text, setText] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [recipe, setRecipe] = useState(null); async function load(e) { e.preventDefault(); setLoading(true); setError(null); try { const data = await api('POST', '/api/haushalt/rezept', mode === 'url' ? { url } : { text }); // Ohne Portionsangabe gilt die Liste für die gewählte Personenzahl, Mengen bleiben wie eingegeben const people = loadPeople() || data.servings || 4; setRecipe({ ...data, base: String(data.servings || people), people: String(people), rows: data.ingredients.map((i) => ({ ...i, matched: i.product, take: null, qty: null })), done: null, }); } catch (err) { setError(err.message); } finally { setLoading(false); } } if (!recipe) { return (

Rezept abgleichen

{mode === 'url' ? ( setUrl(e.target.value)} placeholder="Rezept-Link einfügen, z. B. von chefkoch.de" aria-label="Rezept-Link" required /> ) : (