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 { Heading } from '../ui/heading'; import { Spacer } from '../ui/spacer'; import { TabPanel } from '../ui/tab-panel'; import { useFormContext, Controller, useFieldArray } from 'react-hook-form'; import { IValueSet, useValueSetServiceContext } from '../../services'; import { FhirAnnotation, FhirCode, FhirCodeableConcept, FhirDosage, FhirPeriod, FhirReferenceCollection, FhirValueSetSearch, TypeSelector } from '../../components'; import { useFhirCarePlans, useFhirConditions, useFhirEncounters, useFhirEpisodesOfCare, useFhirMedicationAdministrations, useFhirMedicationDispenses, useFhirMedicationRequests, useFhirMedicationStatementBroadcast, useFhirMedicationStatements, useFhirObservations, useFhirProcedures } from '../../hooks'; import { FhirResource } from 'fhir/r4'; import { useViewerIsPatient } from '../../hooks/useViewerIsPatient'; import { PatientMedicationStatementFields } from './PatientMedicationStatementFields'; interface FhirMedicationStatementProps { elevated?: boolean; disabled?: boolean; enableInlineActions?: boolean; } export const FhirMedicationStatement: React.FC = ({ elevated = true, disabled = false, enableInlineActions = true }) => { const { control, watch } = useFormContext(); const { fetchValueSet, valueSetUrls } = useValueSetServiceContext(); const viewerIsPatient = useViewerIsPatient(); const [loading, setLoading] = useState(false); // value sets const [medicationStatementStatus, setMedicationStatementStatus] = useState([]); const [reasonMedicationStatusCodes, setReasonMedicationStatusCodes] = useState([]); const [medicationStatementCategory, setMedicationStatementCategory] = useState([]); const spacerMargin = '24px'; useFhirMedicationStatementBroadcast(); const { medicationStatementsList } = useFhirMedicationStatements(); const { encountersList } = useFhirEncounters(); const { episodesOfCareList } = useFhirEpisodesOfCare(); const { conditionsList } = useFhirConditions(); const { observationsList } = useFhirObservations(); const { medicationAdministrationsList } = useFhirMedicationAdministrations(); const { medicationDispensesList } = useFhirMedicationDispenses(); const { proceduresList } = useFhirProcedures(); const { medicationRequestsList } = useFhirMedicationRequests(); const { carePlansList } = useFhirCarePlans(); const effectiveType = watch('effectiveType'); const status = watch('status'); const contextFieldArray = useFieldArray({ control, name: 'context' }); const partOfFieldArray = useFieldArray({ control, name: 'partOf' }); const basedOnFieldArray = useFieldArray({ control, name: 'basedOn' }); const reasonReferenceFieldArray = useFieldArray({ control, name: 'reasonReference' }); useEffect(() => { const loadValueSets = async () => { setLoading(true); try { const [ medicationStatementStatusValueSet, reasonMedicationStatusCodesValueSet, medicationStatementCategoryValueSet ] = await Promise.all([ fetchValueSet(valueSetUrls.medicationStatementStatus), fetchValueSet(valueSetUrls.reasonMedicationStatusCodes), fetchValueSet(valueSetUrls.medicationStatementCategory) ]); setMedicationStatementStatus(medicationStatementStatusValueSet); setReasonMedicationStatusCodes(reasonMedicationStatusCodesValueSet); setMedicationStatementCategory(medicationStatementCategoryValueSet); } catch (err) { console.error('Error loading value sets:', err); } finally { setLoading(false); } }; loadValueSets(); }, [fetchValueSet, valueSetUrls]); // A patient records a medicine they take in plain terms; the record's linking fields are for staff. if (viewerIsPatient) { return ( {elevated && } Details ); } return ( {elevated && } Details {/* medicationCodeableConcept */} {/* status */} {/* statusReason */} {status !== 'active' && <> } {/* category */} {/* dateAsserted */} ( )}/> {/* effectiveType */} {effectiveType === 'dateTime' && ( <> {/* effectiveDateTime */} ( )}/> )} {effectiveType === 'period' && ( <> {/* effectivePeriod */} )} {/* context */} { switch (referenceType) { case 'Encounter': return encountersList; case 'EpisodeOfCare': return episodesOfCareList; default: return []; } }} required={false} disabled={disabled} multiple={false} enableInlineActions={enableInlineActions}/> {(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} enableInlineActions={enableInlineActions}/>
); } // dosage if (tab.name === 'dosage') { return (
{/* dosage */}
); } // partOf if (tab.name === 'partOf') { return (
{/* partOf */} { switch (referenceType) { case 'MedicationAdministration': return medicationAdministrationsList; case 'MedicationDispense': return medicationDispensesList; case 'MedicationStatement': return medicationStatementsList; case 'Procedure': return proceduresList; case 'Observation': return observationsList; default: return []; } }} required={false} disabled={disabled} enableInlineActions={enableInlineActions}/>
); } // basedOn if (tab.name === 'basedOn') { return (
{/* basedOn */} { switch (referenceType) { case 'MedicationRequest': return medicationRequestsList; case 'CarePlan': return carePlansList; default: return []; } }} required={false} disabled={disabled} enableInlineActions={enableInlineActions}/>
); } // notes tab if (tab.name === 'notes') { return (
{/* note */}
); } }}
); }; export default FhirMedicationStatement;