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, FlexBlock } from '../ui/flex'; 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 { FhirCode, FhirIdentifier } from '../../components'; import { useFhirDeviceBroadcast, useFhirDevices } from '../../hooks'; import { PlusCircle, Trash2, XCircle } from 'lucide-react'; interface FhirDeviceProps { elevated?: boolean; disabled?: boolean; enableInlineActions?: boolean; } export const FhirDevice: React.FC = ({ elevated = true, disabled = false }) => { const { control } = useFormContext(); const { fetchValueSet, valueSetUrls } = useValueSetServiceContext(); const [loading, setLoading] = useState(false); // value sets const [udiEntryType, setUdiEntryType] = useState([]); const [deviceStatus, setDeviceStatus] = useState([]); const [deviceNametype, setDeviceNametype] = useState([]); const spacerMargin = '24px'; useFhirDevices(); useFhirDeviceBroadcast(); const deviceNameFieldArray = useFieldArray({ control, name: 'deviceName' }); const udiCarrierFieldArray = useFieldArray({ control, name: 'udiCarrier' }); const identifierFieldArray = useFieldArray({ control, name: 'identifier' }); useEffect(() => { const loadValueSets = async () => { setLoading(true); try { const [ udiEntryTypeValueSet, deviceStatusValueSet, deviceNametypeValueSet ] = await Promise.all([ fetchValueSet(valueSetUrls.udiEntryType), fetchValueSet(valueSetUrls.deviceStatus), fetchValueSet(valueSetUrls.deviceNametype) ]); setUdiEntryType(udiEntryTypeValueSet); setDeviceStatus(deviceStatusValueSet.filter((option: IValueSet) => ['active', 'inactive', 'unknown'].includes(option.code))); setDeviceNametype(deviceNametypeValueSet); } catch (err) { console.error('Error loading value sets:', err); } finally { setLoading(false); } }; loadValueSets(); }, [fetchValueSet, valueSetUrls]); const addDeviceName = () => { deviceNameFieldArray.append({ name: '', type: 'user-friendly-name' }); }; const removeDeviceName = (index: number) => { deviceNameFieldArray.remove(index); }; const addUdiCarrier = () => { udiCarrierFieldArray.append({ deviceIdentifier: '', carrierHRF: '' }); }; const removeUdiCarrier = (index: number) => { udiCarrierFieldArray.remove(index); }; return ( {elevated && } Details {/* status */} {/* Device Names */} Device Names {(deviceNameFieldArray.fields as any[]).map((deviceName, index) => (
( <> {fieldState.error && ( Name of the device is required )} )}/> {/* deviceName.type */} {true && ( )}
))}
{(tab) => { // details if (tab.name === 'details') { return (
{/* manufacturer */} ( )}/> {/* modelNumber */} ( )}/> {/* partNumber */} ( )}/> {/* distinctIdentifier */} ( )}/> {/* serialNumber */} ( )}/> {/* lotNumber */} ( )}/> {/* manufactureDate */} ( )}/> {/* expirationDate */} ( )}/>
); } // udi if (tab.name === 'udi') { return (
UDI Information {(udiCarrierFieldArray.fields as any[]).map((udiCarrier, index) => (

UDI Carrier {index + 1}

{/* udiCarrier.deviceIdentifier */} ( )}/> {/* udiCarrier.carrierHRF */} ( )}/> {/* status */}
))}
); } // identifiers if (tab.name === 'identifiers') { return (
); } }}
); }; export default FhirDevice;