import React from 'react'; import { SkeletonText, Tag, Tile } from '@carbon/react'; import { WarningFilled } from '@carbon/react/icons'; import { useTranslation } from 'react-i18next'; import { type PatientUuid, useConfig, UserHasAccess } from '@openmrs/esm-framework'; import { computeMedicationRequestCombinedStatus, getConceptCodingDisplay, useStaleEncounterUuids, getMostRecentMedicationDispenseStatus, } from '../utils'; import { PRIVILEGE_CREATE_DISPENSE } from '../constants'; import { type AllergyIntolerance, type MedicationRequestBundle, MedicationRequestCombinedStatus, MedicationDispenseStatus, } from '../types'; import { type PharmacyConfig } from '../config-schema'; import { usePatientAllergies, usePrescriptionDetails } from '../medication-request/medication-request.resource'; import ActionButtons from '../components/action-buttons.component'; import MedicationEvent from '../components/medication-event.component'; import PrescriptionsActionsFooter from './prescription-actions.component'; import styles from './prescription-details.scss'; const PrescriptionDetails: React.FC<{ encounterUuid: string; patientUuid: PatientUuid; }> = ({ encounterUuid, patientUuid }) => { const { t } = useTranslation(); const config = useConfig(); const { allergies, totalAllergies, isLoading: isLoadingAllergies, error: allergiesError, } = usePatientAllergies(patientUuid, config.refreshInterval); const { medicationRequestBundles, error, isLoading } = usePrescriptionDetails(encounterUuid, config.refreshInterval); const { staleEncounterUuids } = useStaleEncounterUuids(); const generateStatusTag = (medicationRequestBundle: MedicationRequestBundle): React.ReactNode => { const combinedStatus: MedicationRequestCombinedStatus = computeMedicationRequestCombinedStatus( medicationRequestBundle.request, config.medicationRequestExpirationPeriodInDays, ); if (combinedStatus === MedicationRequestCombinedStatus.cancelled) { return {t('cancelled', 'Cancelled')}; } if (combinedStatus === MedicationRequestCombinedStatus.completed) { return {t('completed', 'Completed')}; } if (combinedStatus === MedicationRequestCombinedStatus.expired) { return {t('expired', 'Expired')}; } if (combinedStatus === MedicationRequestCombinedStatus.declined) { return {t('closed', 'Closed')}; } if (combinedStatus === MedicationRequestCombinedStatus.on_hold) { return {t('paused', 'Paused')}; } // If there is no combined status, but the last event was a dispense, display "dispensed" const mostRecentDispenseStatus = getMostRecentMedicationDispenseStatus(medicationRequestBundle.dispenses); if (mostRecentDispenseStatus === MedicationDispenseStatus.completed) { return {t('dispensed', 'Dispensed')}; } return null; }; const displayAllergies = (allergies: Array): string => { const fallbackLabel = t('unknownAllergy', 'Unknown allergy'); return allergies .map((allergy) => { // Prefer code.text as it contains the human-readable allergen name // (especially important for "Other" type allergies where coding display is generic) if (allergy.code?.text) { return allergy.code.text; } if (allergy.code?.coding?.length) { return getConceptCodingDisplay(allergy.code.coding) ?? allergy.code.coding[0]?.display; } return fallbackLabel; }) .filter(Boolean) .join(', '); }; return (
{isLoadingAllergies && ( )} {!isLoadingAllergies && (

{allergiesError && ( {t('errorLoadingAllergies', 'Error loading allergies')}: {allergiesError.message} )} {!allergiesError && totalAllergies > 0 && ( {t('allergiesCount', '{{ count }} allergies', { count: totalAllergies, })} {' '} {displayAllergies(allergies)} )} {!allergiesError && typeof totalAllergies === 'number' && totalAllergies === 0 && t('noAllergyDetailsFound', 'No allergy details found')}

)}
{t('prescribed', 'Prescribed')}
{isLoading && ( )} {error && (

{t('errorLoadingPrescriptionDetails', 'Error loading prescription details')}: {error.message}

)} {medicationRequestBundles && (medicationRequestBundles.length > 0 ? ( medicationRequestBundles.map((bundle) => ( )) ) : (

{t('noPrescriptionsFound', 'No prescriptions found')}

))} {medicationRequestBundles?.length > 0 && ( )}
); }; export default PrescriptionDetails;