'use client' import { useOptimistic, useRef, useState, useTransition } from 'react' import { uuidv7 } from 'uuidv7' import { de } from '@/lib/i18n/de' import { addEntryAction } from '../actions' type Pending = { id: string; body: string; failed: boolean } /** * Vermerk anlegen, optimistisch. * * Die clientseitig erzeugte UUIDv7 ist zugleich Idempotenzschlüssel: ein * Wiederholungsversuch nach einem Netzfehler erzeugt keinen zweiten Eintrag. * Siehe docs/09-performance-und-ux.md. * * Nach dem Absenden springt der Fokus sofort zurück ins leere Feld, Enter * sendet, Shift+Enter macht einen Zeilenumbruch. */ export function EntryComposer({ caseNumber }: { caseNumber: string }) { const [draft, setDraft] = useState('') const [failures, setFailures] = useState([]) const [optimistic, addOptimistic] = useOptimistic( [], (current, entry) => [entry, ...current], ) const [pending, startTransition] = useTransition() const field = useRef(null) function submit(text: string) { const body = text.trim() if (!body) return const id = uuidv7() setDraft('') field.current?.focus() startTransition(async () => { addOptimistic({ id, body, failed: false }) const result = await addEntryAction({ id, caseNumber, body, minClearance: 0 }) if (!result.ok) { // Der Eintrag bleibt stehen und ist als nicht gespeichert markiert. setFailures((current) => [{ id, body, failed: true }, ...current]) } }) } return (
submit(draft)} className="max-w-(--container-measure)" >