import React, { useState, useEffect } from 'react'; import { TextareaControl } from "../ui/textarea-control"; import { Card, CardHeader, CardBody, CardDivider } from '../ui/wp-card'; import { Elevation } from '../ui/elevation'; import { InputControl } from '../ui/input-control'; import { Divider } from '../ui/divider'; import { DismissibleAlert } from '../ui/dismissible-alert'; import { Heading } from '../ui/heading'; import { Flex, FlexItem } from '../ui/flex'; import { Spacer } from '../ui/spacer'; import { TabPanel } from '../ui/tab-panel'; import { Disabled } from '../ui/disabled'; import { useFormContext, Controller, useFieldArray } from 'react-hook-form'; import { IValueSet, useAuthServiceContext, useValueSetServiceContext } from '../../services'; import { FhirCode, FhirCodeableConcept, FhirPeriod, FhirValueSetSearch, TypeSelector } from '../../components'; import { useFhirDetectedIssueBroadcast, useFhirDetectedIssues } from '../../hooks'; import { PlusCircle, Trash2 } from 'lucide-react'; interface FhirDetectedIssueProps { elevated?: boolean; disabled?: boolean; enableInlineActions?: boolean; } export const FhirDetectedIssue: React.FC = ({ elevated = true, disabled = false }) => { const { control, watch } = useFormContext(); const { userRole, USER_ROLES } = useAuthServiceContext(); const { fetchValueSet, valueSetUrls } = useValueSetServiceContext(); const [loading, setLoading] = useState(false); // value sets const [observationStatus, setObservationStatus] = useState([]); const [detectedissueCategory, setDetectedissueCategory] = useState([]); const [detectedissueSeverity, setDetectedissueSeverity] = useState([]); const [detectedissueMitigationAction, setDetectedissueMitigationAction] = useState([]); const isPatient = [USER_ROLES.PATIENT, USER_ROLES.RELATED_PERSON].includes(userRole as string); const spacerMargin = '24px'; useFhirDetectedIssues(); useFhirDetectedIssueBroadcast(); const evidenceFieldArray = useFieldArray({ control, name: 'evidence' }); const mitigationFieldArray = useFieldArray({ control, name: 'mitigation' }); useEffect(() => { const loadValueSets = async () => { setLoading(true); try { const [ observationStatusValueSet, detectedissueCategoryValueSet, detectedissueSeverityValueSet, detectedissueMitigationActionValueSet ] = await Promise.all([ fetchValueSet(valueSetUrls.observationStatus), fetchValueSet(valueSetUrls.detectedissueCategory), fetchValueSet(valueSetUrls.detectedissueSeverity), fetchValueSet(valueSetUrls.detectedissueMitigationAction) ]); setObservationStatus(observationStatusValueSet); setDetectedissueCategory(detectedissueCategoryValueSet); setDetectedissueSeverity(detectedissueSeverityValueSet); setDetectedissueMitigationAction(detectedissueMitigationActionValueSet); } catch (err) { console.error('Error loading value sets:', err); } finally { setLoading(false); } }; loadValueSets(); }, [fetchValueSet, valueSetUrls]); const addEvidence = () => { evidenceFieldArray.append({ detailType: 'reference', code: [], detail: [] }); }; const removeEvidence = (index: number) => { evidenceFieldArray.remove(index); }; const addMitigation = () => { mitigationFieldArray.append({ action: null, date: '', author: null }); }; const removeMitigation = (index: number) => { mitigationFieldArray.remove(index); }; return ( {elevated && } Details {/* code */} {/* status */} {/* severity */} {/* detail */} ( )}/> {/* identifiedType */} {watch('identifiedType') === 'dateTime' && ( <> {/* identifiedDateTime */} ( )}/> )} {watch('identifiedType') === 'period' && ( <> {/* identifiedPeriod */} )} {(tab) => { // evidence if (tab.name === 'evidence') { return (
{evidenceFieldArray.fields.length === 0 && ( <> Evidence {!isPatient && ( )} No evidence added yet. )} {evidenceFieldArray.fields.map((field, index) => (

Evidence {index + 1}

{!isPatient && ( )}
{/* code */}
))} {!isPatient && evidenceFieldArray.fields.length > 0 && ( )}
); } // mitigation if (tab.name === 'mitigation') { return (
{mitigationFieldArray.fields.length === 0 && ( <> Mitigation Actions {!isPatient && ( )} No mitigation actions added yet. )} {mitigationFieldArray.fields.map((field, index) => (

Mitigation {index + 1}

{!isPatient && ( )}
{/* action */} {/* date */} ( )}/> {/* author */} {/**/}
))} {!isPatient && mitigationFieldArray.fields.length > 0 && ( )}
); } }}
); }; export default FhirDetectedIssue;