import { useEffect, useMemo, useState } from "react"; import { useNavigate, useParams } from "react-router-dom"; import { apiGet, apiPut } from "../lib/api"; import type { ActiveCatalogSummary, QuarterKey, SampleDetail, SensitivityResult, } from "../lib/types"; type GroupState = Record; function quarterIdentity(sample: SampleDetail, quarterKey: QuarterKey) { const quarter = sample.quarters.find((entry) => entry.quarterKey === quarterKey); if (!quarter) { return quarterKey; } return quarter.pathogenBusinessKey || quarter.customPathogenName || quarter.pathogenName || quarterKey; } export default function AntibiogramPage() { const { sampleId } = useParams(); const navigate = useNavigate(); const [catalogs, setCatalogs] = useState(null); const [sample, setSample] = useState(null); const [groupState, setGroupState] = useState>({}); const [message, setMessage] = useState(null); const [saving, setSaving] = 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); const nextState: Record = {}; sampleResponse.antibiogramTargets.forEach((referenceQuarter) => { const existingGroup = sampleResponse.antibiograms.find((entry) => entry.quarterKey === referenceQuarter) ?? sampleResponse.antibiograms.find((entry) => entry.inheritedFromQuarter === referenceQuarter); nextState[referenceQuarter] = {}; existingGroup?.entries.forEach((entry) => { nextState[referenceQuarter][entry.antibioticBusinessKey] = entry.result; }); }); setGroupState(nextState); } catch (loadError) { setMessage((loadError as Error).message); } } void load(); }, [sampleId]); const groups = useMemo(() => { if (!sample) { return []; } return sample.antibiogramTargets.map((referenceQuarter) => { const identity = quarterIdentity(sample, referenceQuarter); const reference = sample.quarters.find((quarter) => quarter.quarterKey === referenceQuarter); const inherited = sample.quarters.filter( (quarter) => quarter.quarterKey !== referenceQuarter && quarterIdentity(sample, quarter.quarterKey) === identity && quarter.requiresAntibiogram, ); return { referenceQuarter, reference, inherited }; }); }, [sample]); function updateResult( referenceQuarter: QuarterKey, antibioticBusinessKey: string, result: SensitivityResult, ) { setGroupState((current) => ({ ...current, [referenceQuarter]: { ...current[referenceQuarter], [antibioticBusinessKey]: current[referenceQuarter]?.[antibioticBusinessKey] === result ? undefined : result, }, })); } async function handleSave() { if (!sampleId || !sample) { return; } setSaving(true); setMessage(null); try { const response = await apiPut(`/samples/${sampleId}/antibiogram`, { groups: groups.map((group) => ({ referenceQuarter: group.referenceQuarter, entries: Object.entries(groupState[group.referenceQuarter] ?? {}) .filter((entry): entry is [string, SensitivityResult] => Boolean(entry[1])) .map(([antibioticBusinessKey, result]) => ({ antibioticBusinessKey, result, })), })), }); navigate(`/samples/${response.id}/${response.routeSegment}`); } catch (saveError) { setMessage((saveError as Error).message); } finally { setSaving(false); } } if (!sample || !catalogs) { return
Antibiogramm wird geladen ...
; } return (

Antibiogramm

Probe {sample.sampleNumber}

Nur Viertel mit bakteriellem Wachstum werden angezeigt. Identische Erreger werden automatisch zusammengefasst.

{sample.antibiogramEditable ? null : (
Das Antibiogramm ist in diesem Bearbeitungsstand nur noch lesbar.
)} {message ?
{message}
: null}
{!groups.length ? (
Fuer diese Probe ist kein Antibiogramm erforderlich.
) : ( groups.map((group) => (

{group.reference?.label}

{group.reference?.customPathogenName || group.reference?.pathogenName || "Erreger"}

{group.inherited.length ? (
Gilt ebenfalls fuer {group.inherited.map((entry) => entry.label).join(", ")}
) : null}
{catalogs.antibiotics.map((antibiotic) => ( {(["SENSITIVE", "INTERMEDIATE", "RESISTANT"] as SensitivityResult[]).map((result) => ( ))} ))}
Antibiotikum S I R
{antibiotic.name} {antibiotic.code ?? "ANT"}
)) )}
); }