/** Bottom sheet to finish a pending entry: Worked | Partial | Failed. */ import { useEffect, useState } from "preact/hooks"; import { patchEntry, type Entry } from "../api"; import { Button } from "./Button"; import { ResultChips, type ResolveResult } from "./ResultChips"; import { Sheet } from "./Sheet"; import { useToast } from "./Toast"; type Props = { open: boolean; queue: Entry[]; onClose: () => void; onQueueChange: (next: Entry[]) => void; onResolved: () => void; }; export function ResolvePendingSheet({ open, queue, onClose, onQueueChange, onResolved, }: Props) { const toast = useToast(); const current = queue[0] ?? null; const [result, setResult] = useState(null); const [remedy, setRemedy] = useState(""); const [busy, setBusy] = useState(false); useEffect(() => { if (!current) return; setResult(null); setRemedy(current.remedy || ""); }, [current?.id]); if (!open) return null; const save = async () => { if (!current || !result) return; setBusy(true); try { await patchEntry(current.id, { result, remedy: remedy.trim() }); toast.show("Saved"); onResolved(); const rest = queue.slice(1); if (rest.length) { onQueueChange(rest); } else { onClose(); } } catch (err) { toast.show(err instanceof Error ? err.message : "Could not save", "error"); } finally { setBusy(false); } }; return ( {current ? (
{current.activity ? (

{current.activity}

) : null}

{current.happened}

Result setResult(value as ResolveResult)} />
setRemedy((e.target as HTMLInputElement).value)} />
{queue.length > 1 ? (

{queue.length - 1} more pending after this

) : null}
) : (

Nothing pending.

)}
); }