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 { FhirCodeableConcept, FhirReferenceCollection } from '../../components'; import { useFhirImmunizationEvaluations, useFhirImmunizationRecommendationBroadcast, useFhirImmunizationRecommendations, useFhirImmunizations } from '../../hooks'; import { FhirResource } from 'fhir/r4'; import { PlusCircle, Trash2 } from 'lucide-react'; interface FhirImmunizationRecommendationProps { elevated?: boolean; disabled?: boolean; enableInlineActions?: boolean; } const RecommendationSupportingImmunizationReferences: React.FC<{ index: number; disabled: boolean; readonly: boolean; enableInlineActions: boolean; }> = ({ index, disabled, readonly = false, enableInlineActions = true }) => { const { control } = useFormContext(); const itemReferenceFieldArray = useFieldArray({ control, name: `recommendation.${index}.supportingImmunization` }); const { immunizationsList } = useFhirImmunizations(); const { immunizationEvaluationsList } = useFhirImmunizationEvaluations(); return ( { switch (referenceType) { case 'Immunization': return immunizationsList; case 'ImmunizationEvaluation': return immunizationEvaluationsList; default: return []; } }} required={false} disabled={disabled} readonly={readonly} multiple={true} enableInlineActions={enableInlineActions}/> ); }; export const FhirImmunizationRecommendation: React.FC = ({ elevated = true, disabled = false, enableInlineActions = true }) => { const { control, watch, getValues, setValue } = useFormContext(); const { userRole, USER_ROLES } = useAuthServiceContext(); const { fetchValueSet, valueSetUrls } = useValueSetServiceContext(); const [loading, setLoading] = useState(false); // value sets const [vaccineCode, setVaccineCode] = useState([]); const [immunizationRecommendationTargetDisease, setImmunizationRecommendationTargetDisease] = useState([]); const [immunizationRecommendationStatus, setImmunizationRecommendationStatus] = useState([]); const [immunizationRecommendationReason, setImmunizationRecommendationReason] = useState([]); const [immunizationRecommendationDateCriterion, setImmunizationRecommendationDateCriterion] = useState([]); const isPatient = [USER_ROLES.PATIENT, USER_ROLES.RELATED_PERSON].includes(userRole as string); const spacerMargin = '24px'; useFhirImmunizationRecommendations(); useFhirImmunizationRecommendationBroadcast(); const recommendationFieldArray = useFieldArray({ control, name: 'recommendation' }); useEffect(() => { const loadValueSets = async () => { setLoading(true); try { const [ vaccineCodeValueSet, immunizationRecommendationTargetDiseaseValueSet, immunizationRecommendationStatusValueSet, immunizationRecommendationReasonValueSet, immunizationRecommendationDateCriterionValueSet ] = await Promise.all([ fetchValueSet(valueSetUrls.vaccineCode), fetchValueSet(valueSetUrls.immunizationRecommendationTargetDisease), fetchValueSet(valueSetUrls.immunizationRecommendationStatus), fetchValueSet(valueSetUrls.immunizationRecommendationReason), fetchValueSet(valueSetUrls.immunizationRecommendationDateCriterion) ]); setVaccineCode(vaccineCodeValueSet); setImmunizationRecommendationTargetDisease(immunizationRecommendationTargetDiseaseValueSet); setImmunizationRecommendationStatus(immunizationRecommendationStatusValueSet); setImmunizationRecommendationReason(immunizationRecommendationReasonValueSet); setImmunizationRecommendationDateCriterion(immunizationRecommendationDateCriterionValueSet); } catch (err) { console.error('Error loading value sets:', err); } finally { setLoading(false); } }; loadValueSets(); }, [fetchValueSet, valueSetUrls]); const addRecommendation = () => { recommendationFieldArray.append({ vaccineCode: [], targetDisease: null, contraindicatedVaccineCode: [], forecastStatus: null, forecastReason: [], dateCriterion: [], description: '', series: '', doseNumberPositiveInt: null, doseNumberString: '', seriesDosesPositiveInt: null, seriesDosesString: '', supportingImmunization: [], supportingPatientInformation: [] }); }; const removeRecommendation = (index: number) => { recommendationFieldArray.remove(index); }; const addDateCriterion = (recommendationIndex: number) => { const path = `recommendation.${recommendationIndex}.dateCriterion`; const dateCriterion = getValues(path) || []; setValue(path, [...dateCriterion, { code: null, value: '' }]); }; const removeDateCriterion = (recommendationIndex: number, criterionIndex: number) => { const path = `recommendation.${recommendationIndex}.dateCriterion`; const dateCriterion = getValues(path) || []; dateCriterion.splice(criterionIndex, 1); setValue(path, dateCriterion); }; return ( {elevated && } Details {/* date */} ( <> {fieldState.error && ( Date is required )} )}/> Recommendations {recommendationFieldArray.fields.length === 0 && ( <> {!isPatient && ( )} No recommendations added yet. )} {recommendationFieldArray.fields.map((field, index) => (

Recommendation {index + 1}

{!isPatient && ( )}
{(tab) => { // details if (tab.name === 'details') { return (
{/* recommendation.forecastStatus */} {/* recommendation.forecastReason */} {/* recommendation.vaccineCode */} {/* recommendation.targetDisease */} {/* recommendation.contraindicatedVaccineCode */} {/* description */} ( )}/> {/* series */} ( )}/> {/* doseNumberPositiveInt */} ( field.onChange(parseInt(value) || null)}/> )}/> {/* seriesDosesPositiveInt */} ( field.onChange(parseInt(value) || null)}/> )}/>
); } // dates if (tab.name === 'dates') { return (
Dates governing proposed immunization {(watch(`recommendation.${index}.dateCriterion`) ?? []).length === 0 && ( <> {!isPatient && ( )} No date criteria added yet. )} {(watch(`recommendation.${index}.dateCriterion`) ?? []).map((_criterion, criterionIndex) => (

Date Criterion {criterionIndex + 1}

{!isPatient && ( )}
{/* code */} {/* value */} ( <> {fieldState.error && ( Recommended date is required )} )}/>
))} {!isPatient && (watch(`recommendation.${index}.dateCriterion`) ?? []).length > 0 && ( )}
); } // supporting if (tab.name === 'supporting') { return (
{/* supportingImmunization */}
); } }}
{!isPatient && index === recommendationFieldArray.fields.length - 1 && ( )}
))}
); }; export default FhirImmunizationRecommendation;