import React from 'react'; import dayjs from 'dayjs'; import isToday from 'dayjs/plugin/isToday'; import utc from 'dayjs/plugin/utc'; import { Button } from '@carbon/react'; import { TaskComplete } from '@carbon/react/icons'; import { useTranslation } from 'react-i18next'; import { navigate, showModal, useConfig } from '@openmrs/esm-framework'; import { type Appointment, AppointmentStatus } from '../../types'; import { type ConfigObject } from '../../config-schema'; import { useTodaysVisits } from '../../hooks/useTodaysVisits'; import CheckInButton from './checkin-button.component'; import styles from './appointments-actions.scss'; dayjs.extend(utc); dayjs.extend(isToday); interface AppointmentsActionsProps { appointment: Appointment; } const AppointmentsActions: React.FC = ({ appointment }) => { const { t } = useTranslation(); const { checkInButton, checkOutButton } = useConfig(); const { visits, mutateVisit } = useTodaysVisits(); // TODO doesn't work if visit didn't start today? what about inpatient? const patientUuid = appointment.patient.uuid; const visitDate = dayjs(appointment.startDateTime); const hasActiveVisitToday = visits?.some( (visit) => visit?.patient?.uuid === patientUuid && visit?.startDatetime && !visit?.stopDatetime, ); const isTodaysAppointment = visitDate.isToday(); const isCheckedIn = appointment.status === AppointmentStatus.CHECKEDIN; const isCompleted = appointment.status === AppointmentStatus.COMPLETED; const isCancelled = appointment.status === AppointmentStatus.CANCELLED; const handleCheckout = () => { if (checkOutButton.customUrl) { navigate({ to: checkOutButton.customUrl, templateParams: { patientUuid, appointmentUuid: appointment.uuid } }); } else { const dispose = showModal('end-appointment-modal', { closeModal: () => { mutateVisit(); dispose(); }, patientUuid, appointmentUuid: appointment.uuid, }); } }; const renderVisitStatus = () => { switch (true) { case isCancelled: return ( ); case isCompleted: return ( ); case checkOutButton.enabled && isCheckedIn: return ( ); case checkInButton.enabled && (!hasActiveVisitToday || checkInButton.showIfActiveVisit) && isTodaysAppointment: { return ; } default: return null; } }; return (
<>{renderVisitStatus()}
); }; export default AppointmentsActions;