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 { 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 { FhirAnnotation, FhirCode, FhirContactPoint, FhirPeriod, FhirReference, FhirReferenceCollection, FhirValueSetSearch } from '../../components'; import { useFhirCareTeamBroadcast, useFhirCareTeams, useFhirConditions, useFhirEncounters, useFhirPractitioners, useFhirRelatedPersons } from '../../hooks'; import { FhirResource } from 'fhir/r4'; import { PlusCircle, Trash2 } from 'lucide-react'; interface FhirCareTeamProps { elevated?: boolean; disabled?: boolean; enableInlineActions?: boolean; } const ParticipantMember: React.FC<{ index: number; disabled: boolean; readonly: boolean; enableInlineActions: boolean; }> = ({ index, disabled, readonly = false, enableInlineActions = true }) => { const { control } = useFormContext(); const itemReferenceFieldArray = useFieldArray({ control, name: `participant.${index}.member` }); const { practitionersList } = useFhirPractitioners(); const { relatedPersonsList } = useFhirRelatedPersons(); const { careTeamsList } = useFhirCareTeams(); return ( { switch (referenceType) { case 'Practitioner': return practitionersList.map(p => p.practitioner); case 'RelatedPerson': return relatedPersonsList; case 'CareTeam': return careTeamsList; default: return []; } }} required={true} disabled={disabled} readonly={readonly} multiple={false} enableInlineActions={enableInlineActions}/> ); }; export const FhirCareTeam: 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 [careTeamStatus, setCareTeamStatus] = useState([]); const [careTeamCategory, setCareTeamCategory] = useState([]); const isPatient = [USER_ROLES.PATIENT, USER_ROLES.RELATED_PERSON].includes(userRole as string); const spacerMargin = '24px'; useFhirCareTeams(); useFhirCareTeamBroadcast(); const { encountersList } = useFhirEncounters(); const { conditionsList } = useFhirConditions(); const participantFieldArray = useFieldArray({ control, name: 'participant' }); const telecomFieldArray = useFieldArray({ control, name: 'telecom' }); useEffect(() => { const loadValueSets = async () => { setLoading(true); try { const [ careTeamStatusValueSet, careTeamCategoryValueSet ] = await Promise.all([ fetchValueSet(valueSetUrls.careTeamStatus), fetchValueSet(valueSetUrls.careTeamCategory) ]); setCareTeamStatus(careTeamStatusValueSet); setCareTeamCategory(careTeamCategoryValueSet); } catch (err) { console.error('Error loading value sets:', err); } finally { setLoading(false); } }; loadValueSets(); }, [fetchValueSet, valueSetUrls]); const addParticipant = () => { participantFieldArray.append({ role: null, member: null, onBehalfOf: null }); }; const removeParticipant = (index: number) => { participantFieldArray.remove(index); }; return ( {elevated && } Details {/* name */} ( )}/> {/* status */} {/* category */} {/**/} {/**/} {/* period */} {/* encounter */} {(tab) => { // participants if (tab.name === 'participants') { return (
{participantFieldArray.fields.length === 0 && ( <> {!isPatient && ( )} No participants added yet. )} {participantFieldArray.fields.map((field, index) => (

Participant {index + 1}

{!isPatient && ( )}
{/* participant.role */} {/* participant.member */} {/* participant.period */}
))} {!isPatient && participantFieldArray.fields.length > 0 && ( )}
); } // reasons if (tab.name === 'reasons') { return (
{/* reasonCode */} {/* reasonReference */}
); } // contact if (tab.name === 'contact') { return (
{/* telecom */}
); } // notes if (tab.name === 'notes') { return (
{/* note */}
); } }}
); }; export default FhirCareTeam;