import { useEffect, useMemo, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { apiGet, apiPut } from "../lib/api"; import type { ActiveCatalogSummary, PathogenKind, QuarterKey, QuarterView, SampleDetail } from "../lib/types"; type QuarterFormState = { pathogenBusinessKey: string; customPathogenName: string; cellCount: string; pathogenKind: PathogenKind | null; }; function quarterStateFromSample(sample: SampleDetail) { return sample.quarters.reduce>((accumulator, quarter) => { accumulator[quarter.quarterKey] = { pathogenBusinessKey: quarter.pathogenBusinessKey ?? "", customPathogenName: quarter.customPathogenName ?? "", cellCount: quarter.cellCount ? String(quarter.cellCount) : "", pathogenKind: quarter.pathogenKind, }; return accumulator; }, {}); } // Special pathogen options like in Lua const SPECIAL_PATHOGENS = [ { key: "NO_GROWTH", label: "Kein bakterielles Wachstum", kind: "NO_GROWTH" as PathogenKind }, { key: "CONTAMINATED", label: "Verunreinigte Probe", kind: "CONTAMINATED" as PathogenKind }, ]; export default function AnamnesisPage() { const { sampleId } = useParams(); const navigate = useNavigate(); const [catalogs, setCatalogs] = useState(null); const [sample, setSample] = useState(null); const [quarterStates, setQuarterStates] = useState>({}); const [activeQuarter, setActiveQuarter] = useState(null); const [message, setMessage] = useState(null); const [saving, setSaving] = useState(false); const [showValidation, setShowValidation] = useState(false); useEffect(() => { async function load() { if (!sampleId) { return; } try { const [catalogResponse, sampleResponse] = await Promise.all([ apiGet("/catalogs/summary"), apiGet(`/samples/${sampleId}`), ]); setCatalogs(catalogResponse); setSample(sampleResponse); setQuarterStates(quarterStateFromSample(sampleResponse)); setActiveQuarter(sampleResponse.quarters[0]?.quarterKey ?? null); } catch (loadError) { setMessage((loadError as Error).message); } } void load(); }, [sampleId]); const visibleQuarter = useMemo(() => { if (!sample) { return null; } return sample.quarters.find((quarter) => quarter.quarterKey === activeQuarter) ?? sample.quarters[0] ?? null; }, [activeQuarter, sample]); function updateQuarter(quarterKey: QuarterKey, patch: Partial) { setQuarterStates((current) => ({ ...current, [quarterKey]: { ...current[quarterKey], ...patch, }, })); } function quarterHasPathogen(quarterKey: QuarterKey) { const quarterState = quarterStates[quarterKey]; return Boolean(quarterState?.pathogenBusinessKey || quarterState?.customPathogenName?.trim()); } function selectSpecialPathogen(quarterKey: QuarterKey, kind: PathogenKind) { updateQuarter(quarterKey, { pathogenBusinessKey: "", customPathogenName: "", pathogenKind: kind, }); } function isSpecialPathogenSelected(quarterKey: QuarterKey, kind: PathogenKind) { return quarterStates[quarterKey]?.pathogenKind === kind && !quarterStates[quarterKey]?.pathogenBusinessKey && !quarterStates[quarterKey]?.customPathogenName; } async function handleSave() { if (!sampleId || !sample) { return; } setShowValidation(true); const missingQuarter = sample.quarters.find((quarter) => !quarterHasPathogen(quarter.quarterKey)); if (missingQuarter) { setActiveQuarter(missingQuarter.quarterKey); setMessage("Bitte fuer jede Entnahmestelle einen Erreger auswaehlen oder eingeben."); return; } setSaving(true); setMessage(null); try { const response = await apiPut(`/samples/${sampleId}/anamnesis`, { quarters: sample.quarters.map((quarter) => ({ quarterKey: quarter.quarterKey, pathogenBusinessKey: quarterStates[quarter.quarterKey]?.pathogenBusinessKey || null, customPathogenName: quarterStates[quarter.quarterKey]?.customPathogenName || null, cellCount: quarterStates[quarter.quarterKey]?.cellCount ? Number(quarterStates[quarter.quarterKey]?.cellCount) : null, })), }); navigate(`/samples/${response.id}/${response.routeSegment}`); } catch (saveError) { setMessage((saveError as Error).message); } finally { setSaving(false); } } if (!sample || !catalogs || !visibleQuarter) { return
Anamnese wird geladen ...
; } const state = quarterStates[visibleQuarter.quarterKey] ?? { pathogenBusinessKey: "", customPathogenName: "", cellCount: "", pathogenKind: null, }; return (

Anamnese

Probe {sample.sampleNumber}

Erreger koennen ueber Schnellwahl oder Freitext erfasst werden. Bei 4/4-Proben wird jedes relevante Viertel separat dokumentiert.

{sample.anamnesisEditable ? null : (
Die Anamnese ist in diesem Bearbeitungsstand nur noch lesbar.
)} {message ?
{message}
: null}
{sample.quarters.length > 1 ? (
{sample.quarters.map((quarter) => ( ))}
) : null}

Entnahmestelle

{visibleQuarter.label}

{visibleQuarter.flagged ? (
Auffaelliges Viertel markiert
) : null} {/* Special pathogen options like in Lua */}

Sonderfaelle

{SPECIAL_PATHOGENS.map((pathogen) => ( ))}

Erreger (Katalog)

{catalogs.pathogens.map((pathogen) => ( ))}

Begleitdaten

Hinweis

Bei "Kein bakterielles Wachstum" oder "Verunreinigte Probe" wird das Antibiogramm übersprungen und direkt zur Therapie weitergeleitet.

); }