import React from 'react'; import { Procedure } from 'fhir/r4'; import { FhirCodeableConceptDisplay } from '../../utils/fhirCodeableConcept'; import { FhirCodeDisplay } from '../../utils/fhirCode'; import { FhirPeriodDisplay } from '../../utils/fhirPeriod'; import { FhirRangeDisplay } from '../../utils/fhirRange'; import { FhirAnnotationDisplay } from '../../utils/fhirAnnotation'; import { FhirReferenceDisplay } from '../../utils/fhirReference'; import { formatDateTime } from '../../utils/dateUtils'; import { renderField } from '../../utils/renderField'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '../ui/dialog'; import { Card, CardHeader, CardContent } from '../ui/card'; import { FieldHistoryProvider, FieldHistoryScope } from '../FieldHistory/FieldHistoryProvider'; import { ShowFieldHistoryToggle } from '../FieldHistory/ShowFieldHistoryToggle'; import { PrintRecord } from '../ui/print-record'; import { RecordEditedMarker } from '../FieldHistory/RecordEditedMarker'; import type { ScopedSendRecovery } from '../../hooks/useScopedSendRecovery'; import { CorrectionRequestButton, CorrectionRequestComposer, useCorrectionRequest, type SendCorrectionRequest } from '../CorrectionRequest/CorrectionRequest'; import { FieldGroup, Section } from '../FieldHistory/FieldLayout'; interface FhirProcedureDisplayProps { procedure: Procedure; isOpen: boolean; onClose: () => void; title?: string; onRequestCorrection?: SendCorrectionRequest; correctionError?: string; correctionRecovery?: ScopedSendRecovery; } export const FhirProcedureDisplay: React.FC = ({ procedure, isOpen, onClose, title = "Procedure Details", onRequestCorrection, correctionError, correctionRecovery, }) => { const renderPerformedValue = () => { if (procedure.performedDateTime) { return formatDateTime(procedure.performedDateTime); } if (procedure.performedPeriod) { return ; } if (procedure.performedString) { return procedure.performedString; } if (procedure.performedRange) { return ; } return '-'; }; const renderPerformers = () => { if (!procedure.performer || procedure.performer.length === 0) { return (

No performers recorded

); } return (
{procedure.performer.map((performer, index) => (
Performer {index + 1}
{renderField('Role/Function', )} {renderField('Who performed', )}
))}
); }; const renderFocalDevices = () => { if (!procedure.focalDevice || procedure.focalDevice.length === 0) { return (

No focal devices recorded

); } return (
{procedure.focalDevice.map((device, index) => (
Focal Device {index + 1}
{renderField('Action Performed', )} {renderField('Device', )}
))}
); }; // `procedure` is frequently a forced cast over a union of resource types (several callers keep // one `selectedItem`/`selected.resource` and multiplex it across many `Fhir*Display` modals, // gating only via `isOpen`) -- it can be the wrong resource shape, or undefined, whenever // `isOpen` is false. This guard must run before anything below touches `procedure.*` so a // non-Procedure/absent value while closed never throws (mirrors the original `if (!isOpen) // return null;` that ran before WP's `` was ever constructed). const correction = useCorrectionRequest(procedure?.id); if (!isOpen) return null; return ( { if (!next) onClose(); }} >
{title}
{onRequestCorrection && }
{onRequestCorrection && ( )} {renderField('Procedure', , 'code.coding[0].display')} {renderField('Category', , 'category.coding[0].display')} {renderField('Status', , 'status')} {renderField( 'When Performed', renderPerformedValue(), procedure.performedDateTime ? 'performedDateTime' : procedure.performedString ? 'performedString' : undefined, )} {renderField('Body Site', )} {renderField('Outcome', , 'outcome.coding[0].display')} {renderField('Follow Up Instructions', )} {renderField('Encounter', )} {renderField('Location', )}
{renderField('Reason Code', )} {renderField('Reason Reference', )}
{renderPerformers()}
{renderField('Complication', )} {renderField('Complication Detail', )}
{renderField('Used Code', )} {renderField('Used Reference', )}
{renderFocalDevices()}
{renderField('Based On', )} {renderField('Part Of', )}
{renderField('Additional Notes', )}
); }; export default FhirProcedureDisplay;