import React from 'react'; import { Condition } from 'fhir/r4'; import { FhirCodeableConceptDisplay } from '../../utils/fhirCodeableConcept'; import { FhirIdentifierDisplay } from '../../utils/fhirIdentifier'; import { FhirReferenceDisplay } from '../../utils/fhirReference'; import { FhirAnnotationDisplay } from '../../utils/fhirAnnotation'; import { FhirAgeDisplay } from '../../utils/fhirAge'; import { FhirRangeDisplay } from '../../utils/fhirRange'; import { formatDateTime } from '../../utils/dateUtils'; import { FhirPeriodDisplay } from '../../utils/fhirPeriod'; import { renderField } from '../../utils/renderField'; import { conditionStatusText } from '../../utils/conditionStatus'; 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 { 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 FhirConditionDisplayProps { condition: Condition; isOpen: boolean; onClose: () => void; title?: string; /** Offered to a patient for a provider-authored record, which they can ask to correct but never edit. */ onRequestCorrection?: SendCorrectionRequest; correctionError?: string; correctionRecovery?: ScopedSendRecovery; } export const FhirConditionDisplay: React.FC = ({ condition, isOpen, onClose, title = "Condition Details", onRequestCorrection, correctionError, correctionRecovery, }) => { const renderOnsetDetails = () => { if (condition.onsetDateTime) { return formatDateTime(condition.onsetDateTime); } if (condition.onsetAge) { return ; } if (condition.onsetPeriod) { return ; } if (condition.onsetRange) { return ; } if (condition.onsetString) { return condition.onsetString; } return '-'; }; const renderAbatementDetails = () => { if (condition.abatementDateTime) { return formatDateTime(condition.abatementDateTime); } if (condition.abatementAge) { return ; } if (condition.abatementPeriod) { return ; } if (condition.abatementRange) { return ; } if (condition.abatementString) { return condition.abatementString; } if (condition.abatementBoolean === true) { return 'Yes'; } if (condition.abatementBoolean === false) { return 'No'; } return '-'; }; const renderStages = () => { if (!condition.stage || condition.stage.length === 0) { return (

No stages recorded

); } return (
{condition.stage.map((stage, index) => (
Stage {index + 1}
{renderField('Kind of staging', )} {renderField('Simple summary', )} {renderField('Formal record of assessment', )}
))}
); }; const renderEvidence = () => { if (!condition.evidence || condition.evidence.length === 0) { return (

No evidence recorded

); } return (
{condition.evidence.map((evidence, index) => (
Evidence {index + 1}
{renderField('Manifestation/symptom', )} {renderField('Supporting information', )}
))}
); }; const getConditionProfile = () => { if (condition.category && condition.category.length > 0) { const category = condition.category[0]; if (category.coding && category.coding.length > 0) { const code = category.coding[0].code; if (code === 'encounter-diagnosis') { return 'Encounter Diagnosis'; } if (code === 'problem-list-item' || code === 'health-concern') { return 'Problems and Health Concerns'; } } } return ''; }; // `condition` 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 `condition.*` so a // non-Condition/absent value while closed never throws (mirrors the original `if (!isOpen) // return null;` that ran before WP's `` was ever constructed). const correction = useCorrectionRequest(condition?.id); if (!isOpen) return null; return ( { if (!next) onClose(); }} >
{title}
{onRequestCorrection && }
{onRequestCorrection && ( )}

{condition?.code?.text || condition?.code?.coding?.[0]?.display || 'Condition'}

{getConditionProfile() ? `${condition?.resourceType} - ${getConditionProfile()}` : condition?.resourceType}

{renderField('Identification of the condition, problem or diagnosis', , 'code.coding[0].display')} {renderField('Category', )} {renderField('Subjective severity of condition', , 'severity.coding[0].display')} {renderField('Clinical Status', {conditionStatusText(condition.clinicalStatus, 'clinical')}, 'clinicalStatus.coding[0].code')} {renderField('Verification Status', {conditionStatusText(condition.verificationStatus, 'verification')}, 'verificationStatus.coding[0].code')} {renderField('Anatomical location, if relevant', )} {renderField('Subject', )} {renderField('Encounter created as part of', )} {renderField('Date record was first recorded', formatDateTime(condition.recordedDate), 'recordedDate')} {renderField('Identifiers', )}
{renderField('Estimated or actual date, date-time, or age', renderOnsetDetails())}
{renderField('When in resolution/remission', renderAbatementDetails())}
{renderStages()}
{renderEvidence()}
{renderField('Additional information about the Condition', )}
); }; export default FhirConditionDisplay;