import React, { useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { formatDatetime, parseDate, useConfig, ErrorState, ExtensionSlot } from '@openmrs/esm-framework'; import { CardHeader, useLaunchWorkspaceRequiringVisit } from '@openmrs/esm-patient-common-lib'; import { Tabs, TabList, Tab, TabPanels, TabPanel, Button, TabsSkeleton } from '@carbon/react'; import { CloudMonitoring, IbmWatsonDiscovery, Dashboard, Stethoscope, Add, Edit, DocumentMultiple_02, } from '@carbon/react/icons'; import { extractValueFromObs, useClinicalEncounterForm, usePatientEncounter } from '../../../hooks/usePatientEncounter'; import styles from './encounter-details.scss'; import { type Observation } from '../../../types'; import { ExpressWorkflowConfig } from '../../../config-schema'; type EncounterDetailsProps = { patientUuid: string; patient?: fhir.Patient; }; const EncounterDetails: React.FC = ({ patientUuid, patient }) => { const { t } = useTranslation(); const state = useMemo(() => ({ patientUuid, patient, basePath: 'clinical-encounter' }), [patientUuid, patient]); const { clinicalEncounter: { encounterTypeUuid }, } = useConfig(); const { encounters, isLoading, error, mutate } = usePatientEncounter(patientUuid, encounterTypeUuid); const { conceptLabelMap } = useClinicalEncounterForm(); const lastEncounter = useMemo(() => { return encounters?.sort( (a, b) => new Date(b.encounterDatetime).getTime() - new Date(a.encounterDatetime).getTime(), )[0]; }, [encounters]); // This maps to the different sections of the clinical encounter form const observationsBySection = useMemo(() => { const sections = { 'Visit Details': [], 'Patient History': [], 'Patient Examination': [], 'Patient Management': [], }; if (!lastEncounter?.obs || !conceptLabelMap) { return sections; } lastEncounter.obs.forEach((obs) => { const conceptUuid = obs.concept.uuid; Object.keys(sections).forEach((sectionName) => { if (conceptLabelMap[sectionName]?.[conceptUuid]) { sections[sectionName].push({ title: conceptLabelMap[sectionName][conceptUuid], value: extractValueFromObs(obs as Observation), }); } }); }); return sections; }, [lastEncounter, conceptLabelMap]); if (isLoading) { return ; } if (error) { return ; } return (
{t('visitDetails', 'Visit Details')} {t('patientHistory', 'Patient History')} {t('patientExamination', 'Patient Examination')} {t('patientManagement', 'Patient Management')} {t('labResults', 'Lab Results')}
); }; export default EncounterDetails; type EncounterCardProps = { title: string; cardItems: Array<{ title: string; value: string }>; mutateForm: () => void; encounterUuid?: string; }; const EncounterCard = ({ title, cardItems, mutateForm, encounterUuid }: EncounterCardProps) => { const { t } = useTranslation(); const { clinicalEncounter: { formUuid }, } = useConfig(); const launchWorkspaceRequiringVisit = useLaunchWorkspaceRequiringVisit('patient-form-entry-workspace'); const handleOpenOrEditClinicalEncounterForm = (encounterUuid?: string) => { launchWorkspaceRequiringVisit({ workspaceTitle: title, mutateForm: mutateForm, formInfo: { encounterUuid: encounterUuid ?? '', formUuid: formUuid, additionalProps: {}, }, }); }; return (
{cardItems.map((item) => ( ))}
); }; const CardItem = ({ title, value }: { title: string; value: string }) => { return (

{title}

{value}

); };