import { useEffect, useRef, useState } from 'react' import { Badge, Button, Card, EmptyState } from '../ui' import { TODO_LIMIT, todoButtonLabel, todoKey, urgencyOf, visibleTodos } from '../../lib/financeView' /** * Block 2: „Zu erledigen“, höchstens 7 Zeilen, danach „Alle N anzeigen“. Je Zeile Dringlichkeit (Text), Titel, * Text und genau ein Knopf. onAction(aktion, aufgabe) darf ein Promise liefern; wirft es, steht die Meldung * unter der Zeile. Solange eine Aktion läuft, sind alle Knöpfe gesperrt (kein Doppelklick). */ export default function TodoList({ aufgaben, onAction }) { const [expanded, setExpanded] = useState(false) const [running, setRunning] = useState(null) // Schlüssel der laufenden Aufgabe const [failure, setFailure] = useState(null) // { key, message } const aliveRef = useRef(true) useEffect(() => { aliveRef.current = true return () => { aliveRef.current = false } }, []) const { shown, total } = visibleTodos(aufgaben, expanded) async function run(todo, key) { if (running) return setFailure(null) setRunning(key) try { await onAction(todo.aktion, todo) } catch (err) { if (aliveRef.current) setFailure({ key, message: err?.message || 'Die Aktion ist fehlgeschlagen.' }) } finally { if (aliveRef.current) setRunning(null) } } return ( 0 ? {total} offen : null} className="fin-todo-card" bodyStyle={{ padding: 0 }} > {total === 0 ? ( ) : ( <> {total > TODO_LIMIT && (
)} )}
) }