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 { FhirAnnotation, FhirCode, FhirCodeableConcept, FhirPeriod, FhirRange, FhirReference, FhirReferenceCollection, TypeSelector } from '../../components'; import { useFhirConditions, useFhirDevices, useFhirEncounters, useFhirObservations, useFhirPractitioners, useFhirRiskAssessmentBroadcast, useFhirRiskAssessments } from '../../hooks'; import { FhirResource } from 'fhir/r4'; import { PlusCircle, Trash2 } from 'lucide-react'; interface FhirRiskAssessmentProps { elevated?: boolean; disabled?: boolean; enableInlineActions?: boolean; } export const FhirRiskAssessment: 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 [observationStatus, setObservationStatus] = useState([]); const [riskProbability, setRiskProbability] = useState([]); const isPatient = [USER_ROLES.PATIENT, USER_ROLES.RELATED_PERSON].includes(userRole as string); const spacerMargin = '24px'; useFhirRiskAssessments(); useFhirRiskAssessmentBroadcast(); const { encountersList } = useFhirEncounters(); const { conditionsList } = useFhirConditions(); const { observationsList } = useFhirObservations(); const { practitionersList } = useFhirPractitioners(); const { devicesList } = useFhirDevices(); const reasonReferenceFieldArray = useFieldArray({ control, name: 'reasonReference' }); const predictionFieldArray = useFieldArray({ control, name: 'prediction' }); const performerFieldArray = useFieldArray({ control, name: 'performer' }); useEffect(() => { const loadValueSets = async () => { setLoading(true); try { const [ observationStatusValueSet, riskProbabilityValueSet ] = await Promise.all([ fetchValueSet(valueSetUrls.observationStatus), fetchValueSet(valueSetUrls.riskProbability) ]); setObservationStatus(observationStatusValueSet); setRiskProbability(riskProbabilityValueSet); } catch (err) { console.error('Error loading value sets:', err); } finally { setLoading(false); } }; loadValueSets(); }, [fetchValueSet, valueSetUrls]); const addPrediction = () => { predictionFieldArray.append({ outcome: '', probability: '', probabilityDecimal: undefined, probabilityRange: null, qualitativeRisk: null, when: '', whenPeriod: null, whenRange: null, rationale: '' }); }; const removePrediction = (index: number) => { predictionFieldArray.remove(index); }; return ( {elevated && } Details {/* status */} {/* code */} {/**/} {/**/} {/* method */} {/**/} {/**/} {/* performer */} { switch (referenceType) { case 'Practitioner': return practitionersList.map(p => p.practitioner); case 'Device': return devicesList; default: return []; } }} required={true} multiple={false} disabled={disabled} readonly={isPatient} enableInlineActions={enableInlineActions}/> {/* occurrence */} {watch('occurrence') === 'dateTime' && ( <> {/* occurrenceDateTime */} ( )}/> )} {watch('occurrence') === 'period' && ( <> {/* occurrencePeriod */} )} {/* condition */} {/* mitigation */} ( )}/> {/* encounter */} {(tab) => { // predictions if (tab.name === 'predictions') { return (
{predictionFieldArray.fields.length === 0 && ( <> Predictions {!isPatient && ( )} No predictions added yet. )} {predictionFieldArray.fields.map((field, index) => (

Prediction {index + 1}

{!isPatient && ( )}
{/*Outcome*/} {/**/} {/* prediction.outcome */} {/**/} {/**/} Probability {/* probabilityType */} {watch(`prediction.${index}.probability`) === 'decimal' && ( <> {/* prediction.probabilityDecimal */} ( )}/> )} {watch(`prediction.${index}.probability`) === 'range' && ( <> {/* prediction.probabilityRange */} )} {/* prediction.qualitativeRisk */} {/* prediction.relativeRisk */} ( )}/> {/* when */} {watch(`prediction.${index}.when`) === 'period' && ( <> {/* prediction.whenPeriod */} )} {watch(`prediction.${index}.when`) === 'range' && ( <> )} {/* rationale */} ( )}/>
))} {!isPatient && predictionFieldArray.fields.length > 0 && ( )}
); } // reason if (tab.name === 'reason') { return (
{/* reasonReference */} { switch (referenceType) { case 'Condition': return conditionsList; case 'Observation': return observationsList; default: return []; } }} required={false} disabled={disabled} readonly={isPatient} enableInlineActions={enableInlineActions}/>
); } // notes if (tab.name === 'notes') { return (
{/* note */}
); } }}
); }; export default FhirRiskAssessment;