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 { 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, FhirQuantity, FhirReference } from '../../components'; import { useFhirEncounters, useFhirVisionPrescriptionBroadcast, useFhirVisionPrescriptions } from '../../hooks'; import { PlusCircle, Trash2 } from 'lucide-react'; interface FhirVisionPrescriptionProps { elevated?: boolean; disabled?: boolean; enableInlineActions?: boolean; } export const FhirVisionPrescription: 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 [fmStatus, setFmStatus] = useState([]); const [visionProduct, setVisionProduct] = useState([]); const [visionEyeCodes, setVisionEyeCodes] = useState([]); const [visionBaseCodes, setVisionBaseCodes] = useState([]); const isPatient = [USER_ROLES.PATIENT, USER_ROLES.RELATED_PERSON].includes(userRole as string); const spacerMargin = '24px'; useFhirVisionPrescriptions(); useFhirVisionPrescriptionBroadcast(); const { encountersList } = useFhirEncounters(); const lensSpecificationFieldArray = useFieldArray({ control, name: 'lensSpecification' }); useEffect(() => { const loadValueSets = async () => { setLoading(true); try { const [ fmStatusValueSet, visionProductValueSet, visionEyeCodesValueSet, visionBaseCodesValueSet ] = await Promise.all([ fetchValueSet(valueSetUrls.fmStatus), fetchValueSet(valueSetUrls.visionProduct), fetchValueSet(valueSetUrls.visionEyeCodes), fetchValueSet(valueSetUrls.visionBaseCodes) ]); setFmStatus(fmStatusValueSet); setVisionProduct(visionProductValueSet); setVisionEyeCodes(visionEyeCodesValueSet); setVisionBaseCodes(visionBaseCodesValueSet); } catch (err) { console.error('Error loading value sets:', err); } finally { setLoading(false); } }; loadValueSets(); }, [fetchValueSet, valueSetUrls]); const addLensSpecification = () => { lensSpecificationFieldArray.append({ product: null, eye: null, sphere: 0, cylinder: 0, axis: 0, prism: [], add: 0, power: 0, backCurve: 0, diameter: 0, duration: null, color: '', brand: '', note: [] }); }; const removeLensSpecification = (index: number) => { lensSpecificationFieldArray.remove(index); }; const addPrism = (lensIndex: number) => { const prisms = getValues(`lensSpecification.${lensIndex}.prism`) || []; setValue(`lensSpecification.${lensIndex}.prism`, [ ...prisms, { amount: 0, base: null } ]); }; const removePrism = (lensIndex: number, prismIndex: number) => { const prisms = getValues(`lensSpecification.${lensIndex}.prism`) || []; setValue(`lensSpecification.${lensIndex}.prism`, prisms.filter((_, i) => i !== prismIndex)); }; return ( {elevated && } Details {/* status */} {/* created */} ( <> {fieldState.error && ( Response creation date is required )} )}/> {/* dateWritten */} ( <> {fieldState.error && ( Prescription authorization date is required )} )}/> {/* prescriber is NOT a field here on purpose: the service stamps it from the signed-in practitioner on save. FHIR marks it 1..1, and asking somebody to pick themselves out of a list to sign their own prescription is friction, not safety. */} {/* encounter */} {(tab) => { // lensSpecifications if (tab.name === 'lensSpecifications') { return (
{lensSpecificationFieldArray.fields.length === 0 && ( <> {!isPatient && ( )} No lens specifications added yet. )} {lensSpecificationFieldArray.fields.map((field, index) => (

Lens Specification {index + 1}

{!isPatient && ( )}
{/* eye */} {/* product */} Lens Parameters {/* sphere */} ( )}/> {/* cylinder */} ( )}/> {/* axis */} ( )}/> {/* add */} ( )}/> {/* power */} ( )}/> {/* backCurve */} ( )}/> {/* diameter */} ( )}/> Additional Information {/* color */} ( )}/> {/* brand */} ( )}/> {/* duration */} Prisms {(watch(`lensSpecification.${index}.prism`) ?? []).length === 0 && ( <> {!isPatient && ( )} No prisms added yet. )} {(watch(`lensSpecification.${index}.prism`) ?? []).map((_prism, prismIndex) => (

Prism {prismIndex + 1}

{!isPatient && ( )}
{/* amount */} ( <> {fieldState.error && ( Amount of adjustment is required )} )}/> {/* base */}
))} {!isPatient && (watch(`lensSpecification.${index}.prism`) ?? []).length > 0 && ( )} {/* note */}
))} {!isPatient && lensSpecificationFieldArray.fields.length > 0 && ( )}
); } // identifiers if (tab.name === 'identifiers') { return (
); } }}
); }; export default FhirVisionPrescription;