import React, { useState, useEffect } from 'react'; 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, FhirReference } from '../../components'; import { useFhirCareTeams, useFhirConditions, useFhirEpisodeOfCareBroadcast, useFhirEpisodesOfCare, useFhirPractitioners } from '../../hooks'; import { PlusCircle, Trash2 } from 'lucide-react'; interface FhirEpisodeOfCareProps { elevated?: boolean; disabled?: boolean; enableInlineActions?: boolean; } export const FhirEpisodeOfCare: React.FC = ({ elevated = true, disabled = false, enableInlineActions = true }) => { const { control } = useFormContext(); const { userRole, USER_ROLES } = useAuthServiceContext(); const { fetchValueSet, valueSetUrls } = useValueSetServiceContext(); const [loading, setLoading] = useState(false); // value sets const [episodeOfCareStatus, setEpisodeOfCareStatus] = useState([]); const [episodeofcareType, setEpisodeofcareType] = useState([]); const [diagnosisRole, setDiagnosisRole] = useState([]); const isPatient = [USER_ROLES.PATIENT, USER_ROLES.RELATED_PERSON].includes(userRole as string); const spacerMargin = '24px'; useFhirEpisodesOfCare(); useFhirEpisodeOfCareBroadcast(); const { conditionsList } = useFhirConditions(); const { careTeamsList } = useFhirCareTeams(); const { practitionersList } = useFhirPractitioners(); const statusHistoryFieldArray = useFieldArray({ control, name: 'statusHistory' }); const diagnosisFieldArray = useFieldArray({ control, name: 'diagnosis' }); useEffect(() => { const loadValueSets = async () => { setLoading(true); try { const [ episodeOfCareStatusValueSet, episodeofcareTypeValueSet, diagnosisRoleValueSet, ] = await Promise.all([ fetchValueSet(valueSetUrls.episodeOfCareStatus), fetchValueSet(valueSetUrls.episodeofcareType), fetchValueSet(valueSetUrls.diagnosisRole) ]); setEpisodeOfCareStatus(episodeOfCareStatusValueSet); setEpisodeofcareType(episodeofcareTypeValueSet); setDiagnosisRole(diagnosisRoleValueSet); } catch (err) { console.error('Error loading value sets:', err); } finally { setLoading(false); } }; loadValueSets(); }, [fetchValueSet, valueSetUrls]); const addStatusHistory = () => { statusHistoryFieldArray.append({ status: '', }); }; const removeStatusHistory = (index: number) => { statusHistoryFieldArray.remove(index); }; const addDiagnosis = () => { diagnosisFieldArray.append({ condition: null, role: null, rank: null }); }; const removeDiagnosis = (index: number) => { diagnosisFieldArray.remove(index); }; return ( {elevated && } Details {/* status */} {/* type */} {/* period */} {/* careManager */} p.practitioner)} enableInlineActions={enableInlineActions} required={false} disabled={disabled}/> {/* team */} {(tab) => { // diagnosis if (tab.name === 'diagnosis') { return (
{diagnosisFieldArray.fields.length === 0 && ( <> Diagnoses {!isPatient && ( )} No diagnoses added yet. )} {diagnosisFieldArray.fields.map((field, index) => (

Diagnosis {index + 1}

{!isPatient && ( )}
{/* diagnosis.condition */} {/* diagnosis.role */} {/* diagnosis.rank */} ( )}/>
))} {!isPatient && diagnosisFieldArray.fields.length > 0 && ( )}
); } // statusHistory if (tab.name === 'statusHistory') { return (
{statusHistoryFieldArray.fields.length === 0 && ( <> Past list of status codes (the current status may be included to cover the start date of the status) {!isPatient && ( )} No status history added yet. )} {statusHistoryFieldArray.fields.map((field, index) => (

Status History {index + 1}

{!isPatient && ( )}
{/* status */} {/* period */}
))} {!isPatient && statusHistoryFieldArray.fields.length > 0 && ( )}
); } }}
); }; export default FhirEpisodeOfCare;