import { useState, useEffect, useCallback } from 'react'; import { Item, ItemGroup } from "../../../components/ui/item-group"; import { useNavigate } from 'react-router-dom'; import { Card, CardHeader, CardBody } from '../../../components/ui/wp-card'; import { Heading } from '../../../components/ui/heading'; import { Flex, FlexItem, FlexBlock } from '../../../components/ui/flex'; import { Text } from '../../../components/ui/text'; import { Plus } from 'lucide-react'; import { Medication } from 'fhir/r4'; import { useMedicationServiceContext } from '../../../services'; import { AppSpinner } from '../../../components'; import { ResourceListStatus } from '../../../components/ui/resource-list-status'; import { formatFhirCodeableConcept } from '../../../utils/fhirCodeableConcept.tsx'; const Medications = () => { const navigate = useNavigate(); const { fetchMedicationsWithPolling, shouldReload, setShouldReload, medicationsBundle, medicationsList, setUnsaved, setMedicationState } = useMedicationServiceContext(); const [searchTerm, setSearchTerm] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const loadData = useCallback(async () => { setLoading(true); try { await fetchMedicationsWithPolling(); } catch (error) { console.error('Failed to load medications:', error); setError(`Could not load medications. Try again.`); } finally { setLoading(false); if (shouldReload) { setShouldReload(false); } } }, [shouldReload, fetchMedicationsWithPolling, setShouldReload]); useEffect(() => { if (!medicationsBundle || shouldReload) { loadData(); } setUnsaved(false); }, [loadData, medicationsBundle, shouldReload, setUnsaved]); const viewMedication = (medication: Medication) => { navigate(medication.id as string, { relative: 'route', state: { medication: medication } }); }; const addMedication = () => { navigate('new', { relative: 'route', state: { medication: null } }); }; const getMedicationName = (medication: Medication) => { if (medication.code) { return formatFhirCodeableConcept(medication.code); } return 'Unnamed Medication'; }; const getMedicationDetails = (medication: Medication) => { const details = []; if (medication.form) { details.push(formatFhirCodeableConcept(medication.form)); } if (medication.amount) { const amount = medication.amount; if (amount.numerator && amount.denominator) { details.push(`${amount.numerator.value} ${amount.numerator.unit} / ${amount.denominator.value} ${amount.denominator.unit}`); } else if (amount.numerator) { details.push(`${amount.numerator.value} ${amount.numerator.unit}`); } } if (medication.manufacturer && medication.manufacturer.display) { details.push(`Mfr: ${medication.manufacturer.display}`); } return details.join(' • '); }; const filteredMedications = medicationsList.filter(medication => { if (!searchTerm) return true; const medicationName = getMedicationName(medication).toLowerCase(); const searchLower = searchTerm.toLowerCase(); return medicationName.includes(searchLower); }); return ( Medications setError(null)} /> <> {loading ? ( ) : ( <> {filteredMedications.length !== 0 && ( {filteredMedications.map((medication: Medication) => { const medicationName = getMedicationName(medication); const medicationDetails = getMedicationDetails(medication); return ( viewMedication(medication)}> {/**/} {/* */} {/**/} {medicationName} {medicationDetails && ( {medicationDetails} )} {medication.ingredient && medication.ingredient.length > 0 && ( {medication.ingredient.length} ingredient{medication.ingredient.length !== 1 ? 's' : ''} )} ); })} )} )} ); }; export default Medications;