diff --git a/src/pages/StatementCreation.jsx b/src/pages/StatementCreation.jsx index c5e1189..4ebbf38 100644 --- a/src/pages/StatementCreation.jsx +++ b/src/pages/StatementCreation.jsx @@ -78,31 +78,119 @@ function HighlightedTextarea({ value, onChange, wordMap, rows = 3, placeholder, ); } -// ─── PairForm ───────────────────────────────────────────────────────────────── -function PairForm({ objectId, onPairSaved, onCancel }) { +// ─── WordSearch (for word pickers) ─────────────────────────────────────────── +function WordSearch({ existingIds = [], onAdd, placeholder = 'Wort suchen…' }) { + const lang = getUserLang(); + const [q, setQ] = useState(''); + const [results, setResults] = useState([]); + const [open, setOpen] = useState(false); + const [creating, setCreating] = useState(false); + const ref = useRef(null); + + useEffect(() => { + if (!q.trim()) { setResults([]); return; } + const t = setTimeout(async () => { + try { + const data = await apiFetch(`/words?search=${encodeURIComponent(q.trim())}&limit=10`); + setResults(Array.isArray(data) ? data.filter(w => !existingIds.includes(w.id)) : []); + } catch {} + }, 300); + return () => clearTimeout(t); + }, [q, existingIds]); + + useEffect(() => { + function out(e) { if (ref.current && !ref.current.contains(e.target)) setOpen(false); } + document.addEventListener('mousedown', out); + return () => document.removeEventListener('mousedown', out); + }, []); + + async function handleCreate() { + setCreating(true); + try { + const w = await apiPost('/words', { [`titel_${lang}`]: q.trim() }); + onAdd(w); setQ(''); setResults([]); setOpen(false); + } catch (e) { alert('Fehler: ' + e.message); } + finally { setCreating(false); } + } + + return ( +
Frage + Positive Aussage erforderlich.
+ )} +Antwort
+Positive Wörter
+Negative Wörter
+{validationHint()}
} + +