import React from 'react'; import { AdverseEvent } from 'fhir/r4'; import { FhirCodeableConceptDisplay } from '../../utils/fhirCodeableConcept'; import { FhirCodeDisplay } from '../../utils/fhirCode'; 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 { RecordEditedMarker } from '../FieldHistory/RecordEditedMarker'; import { FieldGroup, Section } from '../FieldHistory/FieldLayout'; interface FhirAdverseEventDisplayProps { adverseEvent: AdverseEvent; isOpen: boolean; onClose: () => void; title?: string; } export const FhirAdverseEventDisplay: React.FC = ({ adverseEvent, isOpen, onClose, title = "Adverse Event Details" }) => { // Doubly-nested: each `suspectEntity[]` entry (outer/"secondary" tier) embeds its own // `causality[]` (inner/"tertiary" tier). The outer tier gets `bg-muted/30` and the inner tier // `border-0 shadow-none` -- the same tinted-outer/flat-inner approximation already established // for the other doubly-nested Card-in-Card structure in this wave (see // FhirImmunizationRecommendationDisplay's recommendation/dateCriterion nesting). const renderSuspectEntities = () => { if (!adverseEvent.suspectEntity || adverseEvent.suspectEntity.length === 0) { return (

No suspect entities recorded

); } return (
{adverseEvent.suspectEntity.map((entity, index) => (
Suspect Entity {index + 1}
{renderField('Instance', )}
{entity.causality && entity.causality.length > 0 ? (
Causality Assessments
{entity.causality.map((causality, causalityIndex) => (
Assessment {causalityIndex + 1}
{renderField('Assessment', )} {renderField('Product Relatedness', causality.productRelatedness)} {renderField('Author', )} {renderField('Method', )}
))}
) : (

No causality assessments recorded

)}
))}
); }; // `adverseEvent` 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 // `adverseEvent.*` so a non-AdverseEvent/absent value while closed never throws (mirrors the // original `if (!isOpen) return null;` that ran before WP's `` was ever constructed). if (!isOpen) return null; return ( { if (!next) onClose(); }} >
{title}
{renderField('Type of Event', , 'event.coding[0].display')} {renderField('Category', )} {renderField('Actuality', , 'actuality')} {renderField('Encounter', )} {renderField('Location', )} {renderField('Resulting Condition', )}
{renderField('When Event Occurred', formatDateTime(adverseEvent.date), 'date')} {renderField('When Event was Detected', formatDateTime(adverseEvent.detected), 'detected')} {renderField('When Event was Recorded', formatDateTime(adverseEvent.recordedDate), 'recordedDate')}
{renderField('Seriousness', , 'seriousness.coding[0].display')} {renderField('Severity', , 'severity.coding[0].display')} {renderField('Outcome', , 'outcome.coding[0].display')}
{renderSuspectEntities()}
{renderField('Who was Involved', )}
{renderField('Relevant Medical History', )}
{renderField('Study', )}
); }; export default FhirAdverseEventDisplay;