import { useEffect, useState } from "react"; import { useNavigate, useParams } from "react-router"; import type { ExtractedMarker } from "@helios/shared"; import { api } from "../api"; export function LabDraft() { const { id } = useParams<{ id: string }>(); const nav = useNavigate(); const [meta, setMeta] = useState<{ filename: string; status: string; error: string | null } | null>(null); const [collectedDate, setCollectedDate] = useState(""); const [labName, setLabName] = useState(""); const [markers, setMarkers] = useState([]); const [error, setError] = useState(null); const [busy, setBusy] = useState(false); useEffect(() => { if (!id) return; api.labDraft(id).then((r) => { setMeta({ filename: r.filename, status: r.status, error: r.error }); if (r.draft) { setCollectedDate(r.draft.collectedDate ?? ""); setLabName(r.draft.labName ?? ""); setMarkers(r.draft.markers); } }).catch((e) => setError(e.message)); }, [id]); const edit = (i: number, patch: Partial) => setMarkers((m) => m.map((row, j) => (j === i ? { ...row, ...patch } : row))); const remove = (i: number) => setMarkers((m) => m.filter((_, j) => j !== i)); const addRow = () => setMarkers((m) => [...m, { panel: null, name: "", value: "", unit: null, referenceRange: null, flagged: false }]); const confirm = async () => { if (!id) return; setBusy(true); setError(null); try { const { drawId } = await api.confirmDraft(id, { collectedDate, labName: labName || null, markers }); nav(`/labs/draw/${drawId}`); } catch (e) { setError(e instanceof Error ? e.message : "confirm failed"); } finally { setBusy(false); } }; if (!meta) return

Loading…

; return (

Review: {meta.filename}

{meta.error &&

Extraction failed: {meta.error}. You can still enter values manually below.

} {meta.status !== "pending" &&

This draft is already {meta.status}.

}

Check every value against the PDF (open original). Nothing is saved until you confirm.

{markers.map((m, i) => ( ))}
NameValueUnitRangeFlag
edit(i, { name: e.target.value })} /> edit(i, { value: e.target.value })} /> edit(i, { unit: e.target.value || null })} /> edit(i, { referenceRange: e.target.value || null })} /> edit(i, { flagged: e.target.checked })} />
{error &&

{error}

} {meta.status === "pending" && (
)}
); }