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 { Heading } from '../ui/heading'; 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, FhirPeriod, FhirReference, FhirReferenceCollection, FhirTiming, FhirValueSetSearch, TypeSelector } from '../../components'; import { useFhirCareTeams, useFhirConditions, useFhirDeviceRequestBroadcast, useFhirDeviceRequests, useFhirDevices, useFhirEncounters, useFhirHealthcareServices, useFhirObservations, useFhirPractitioners, useFhirRelatedPersons } from '../../hooks'; import { FhirResource } from 'fhir/r4'; interface FhirDeviceRequestProps { elevated?: boolean; disabled?: boolean; enableInlineActions?: boolean; } export const FhirDeviceRequest: React.FC = ({ elevated = true, disabled = false, enableInlineActions = true }) => { const { control, watch } = useFormContext(); const { userRole, USER_ROLES } = useAuthServiceContext(); const { fetchValueSet, valueSetUrls } = useValueSetServiceContext(); const [loading, setLoading] = useState(false); // value sets const [requestStatus, setRequestStatus] = useState([]); const [requestIntent, setRequestIntent] = useState([]); const [requestPriority, setRequestPriority] = useState([]); const isPatient = [USER_ROLES.PATIENT, USER_ROLES.RELATED_PERSON].includes(userRole as string); const spacerMargin = '24px'; useFhirDeviceRequests(); useFhirDeviceRequestBroadcast(); const { practitionersList } = useFhirPractitioners(); const { conditionsList } = useFhirConditions(); const { observationsList } = useFhirObservations(); const { careTeamsList } = useFhirCareTeams(); const { healthcareServicesList } = useFhirHealthcareServices(); const { devicesList } = useFhirDevices(); const { relatedPersonsList } = useFhirRelatedPersons(); const { encountersList } = useFhirEncounters(); const supportingInfoFieldArray = useFieldArray({ control, name: 'supportingInfo' }); const occurrenceType = watch('occurrenceType'); const reasonReferenceFieldArray = useFieldArray({ control, name: 'reasonReference' }); const performerFieldArray = useFieldArray({ control, name: 'performer' }); useEffect(() => { const loadValueSets = async () => { setLoading(true); try { const [ requestStatusValueSet, requestIntentValueSet, requestPriorityValueSet ] = await Promise.all([ fetchValueSet(valueSetUrls.requestStatus), fetchValueSet(valueSetUrls.requestIntent), fetchValueSet(valueSetUrls.requestPriority) ]); setRequestStatus(requestStatusValueSet); setRequestIntent(requestIntentValueSet); setRequestPriority(requestPriorityValueSet); } catch (err) { console.error('Error loading value sets:', err); } finally { setLoading(false); } }; loadValueSets(); }, [fetchValueSet, valueSetUrls]); return ( {elevated && } Details {/* codeCodeableConcept */} {/* status */} {/* intent */} {/* priority */} {/* authoredOn */} ( )}/> {/* encounter */} When is the device needed? {/* occurrenceType */} {occurrenceType === 'dateTime' && ( <> {/* occurrenceDateTime */} ( )}/> )} {occurrenceType === 'period' && ( <> {/* occurrencePeriod */} )} {occurrenceType === 'timing' && ( <> {/* occurrenceTiming */} )} {(tab) => { // reason if (tab.name === 'reason') { return (
{/* reasonCode */} {/* reasonReference */} { switch (referenceType) { case 'Condition': return conditionsList; case 'Observation': return observationsList; default: return []; } }} required={false} disabled={disabled} readonly={isPatient} enableInlineActions={enableInlineActions}/>
); } // performer if (tab.name === 'performer') { return (
{/* performerType */} {/* performer */} { switch (referenceType) { case 'Practitioner': return practitionersList.map(p => p.practitioner); case 'CareTeam': return careTeamsList; case 'HealthcareService': return healthcareServicesList; case 'Device': return devicesList; case 'RelatedPerson': return relatedPersonsList; default: return []; } }} required={false} disabled={disabled} readonly={isPatient} multiple={false} enableInlineActions={enableInlineActions}/>
); } // notes if (tab.name === 'notes') { return (
{/* note */}
); } }}
); }; export default FhirDeviceRequest;