import { availableRecordEmpty, useChartRecordStanding } from "../../../../hooks/useRecordAccessStanding"; import { useState } from "react"; import { useNavigate } from "react-router-dom"; import { MedicationRequest } from "fhir/r4"; import { FhirMedicationRequestDisplay } from "../../../../components"; import { useFhirMedicationRequestBroadcast, useFhirMedicationRequests, useFhirMedicationRequestTargetedBroadcast, } from "../../../../hooks"; import { useAuthServiceContext } from "../../../../services"; import { EmptyState } from "../../../../components/ui/empty-state"; import { Skeleton } from "../../../../components/ui/skeleton"; import { ChevronRight, Edit, FileText, Pill, Plus } from "lucide-react"; import { Button } from "../../../../components/ui/button"; import { Sheet, SheetContent } from "../../../../components/ui/sheet"; import { mayEditRecord } from '../../../../utils/recordEditability'; import { useSeatStanding } from '../../../../utils/seatStanding'; import { SourcePractice } from '../../../../components/ui/source-practice'; import { medicationNameOf } from '../../../../utils/medicationName'; import { RecordPracticeNote, recordPracticeId, useRecordPracticeView, useRetireOnPracticeChange } from '../../../../contexts/RecordPracticeContext'; const MedicationRequests = () => { const { standing: recordStanding } = useChartRecordStanding(); const navigate = useNavigate(); const { userRole, USER_ROLES, practitionerRoles } = useAuthServiceContext(); const seatStanding = useSeatStanding(); const { loading, error, medicationRequestsList, freshness: recordFreshness } = useFhirMedicationRequests(); const [selectedMedicationRequest, setSelectedMedicationRequest] = useState(null); const [showDisplayModal, setShowDisplayModal] = useState(false); // The record's practice context: its own prescriptions under a named practice; the empty state speaks for the whole record. const practiceView = useRecordPracticeView(medicationRequestsList, recordPracticeId); useRetireOnPracticeChange(() => { setShowDisplayModal(false); setSelectedMedicationRequest(null); }); useFhirMedicationRequestBroadcast(); useFhirMedicationRequestTargetedBroadcast({ medicationRequest: selectedMedicationRequest || undefined, isOpen: showDisplayModal, onUpdate: (updatedMedicationRequest) => { setSelectedMedicationRequest(updatedMedicationRequest); }, onDelete: () => { setShowDisplayModal(false); setSelectedMedicationRequest(null); }, }); const viewMedicationRequest = (medicationRequest: MedicationRequest) => { setSelectedMedicationRequest(medicationRequest); setShowDisplayModal(true); }; const editMedicationRequest = ( event: React.MouseEvent, medicationRequest: MedicationRequest, ) => { event.stopPropagation(); navigate(medicationRequest.id as string, { relative: "path" }); }; const addMedicationRequest = () => { navigate("new", { relative: "path" }); }; const roleAllowsEdit = () => { return userRole && [USER_ROLES.PRACTITIONER].includes(userRole as string); }; /* * AND THE ROLE IS NOT THE RULE THE SERVER APPLIES. * * Writing a MedicationRequest needs a paid clinician seat, resolved per request by `callerMayWrite`. The role * check above passes for an unseated practitioner - a medical assistant, a nurse rooming patients, * somebody whose seat was turned off this morning - so the page offered Add and Edit, and the save * came back refused. A refusal that arrives after the typing has already spent the work. */ const seat = mayEditRecord({ seatStanding, resourceType: 'MedicationRequest', viewerIsStaff: Boolean(userRole) && ![USER_ROLES.PATIENT, USER_ROLES.RELATED_PERSON].includes(userRole as string), practitionerRoles, }); const isAuthorizedToEdit = () => roleAllowsEdit() && seat.mayEdit; // WHOSE SCREEN THIS IS. The same component is the patient's "Prescriptions" and the clinician's // "Medication Requests" - two audiences, and the patient-terminology ruling covers only one of them. const isPatientOrProxy = [USER_ROLES.PATIENT, USER_ROLES.RELATED_PERSON].includes(userRole as string); return (

{isPatientOrProxy ? "Prescriptions" : "Medication Requests"}

{isPatientOrProxy ? "Medicines a clinician has prescribed for you." : "Prescriptions and medication orders for patient treatment plans."}

{/* SAID, NOT WITHHELD. A control that simply disappears reads as a broken screen or as a permission the reader has lost, and both send them to an administrator to check permissions that are already correct. A seat is nameable, and a practice can enable one in a minute. */} {roleAllowsEdit() && !seat.mayEdit && (

{seat.reason}

)} {isAuthorizedToEdit() && ( )}
{error ? (
{" "}

Could not load Medication requests

Try again later.

) : !loading && medicationRequestsList.length === 0 ? ( /* THE OLD COPY POINTED AT A CONTROL THE READER COULD NOT HAVE. It said "Click Add to add a medication request" to everyone - but `isAuthorizedToEdit` is PRACTITIONER-only, so a patient was told to press a button that is not on their screen. That is the failure the shared EmptyState's own note warns about: the next step has to be reachable FROM HERE. It also stated its title twice, and called a prescription a "medication request" on a patient's own record. */ ) : loading ? (
{[...Array(7)].map((_, index) => (
))}
) : ( medicationRequestsList.length !== 0 && (
{practiceView.shown.map( (medicationRequest: MedicationRequest) => { return (
viewMedicationRequest(medicationRequest)} onKeyDown={(event: React.KeyboardEvent) => { if (event.key !== 'Enter' && event.key !== ' ') return; event.preventDefault(); viewMedicationRequest(medicationRequest); }} >

{medicationNameOf(medicationRequest) ?? "No name provided"} {medicationRequest.status ? medicationRequest.status : "Status unknown"}

{medicationRequest.intent && medicationRequest.intent}

{" "}

{isAuthorizedToEdit() && (
)}
); }, )}
) )} {selectedMedicationRequest && ( { if (!open) setSelectedMedicationRequest(null); }} > { setShowDisplayModal(false); setSelectedMedicationRequest(null); }} /> )}
); }; export default MedicationRequests; // import { useNavigate } from 'react-router-dom'; // import { MedicationRequest } from 'fhir/r4'; // import { AppSpinner, FhirMedicationRequestDisplay, ScrollableTab } from '../../../../components'; // import { // useFhirMedicationRequestBroadcast, // useFhirMedicationRequests, // useFhirMedicationRequestTargetedBroadcast // } from '../../../../hooks'; // import { useAuthServiceContext, useMedicationRequestServiceContext } from '../../../../services'; // const MedicationRequests = () => { // const navigate = useNavigate(); // const { userRole, USER_ROLES } = useAuthServiceContext(); // const { getMedicationRequestDisplay } = useMedicationRequestServiceContext(); // const { loading, error, clearError, medicationRequestsList } = useFhirMedicationRequests(); // const [isGuideOpen, setIsGuideOpen] = useState(false); // const [selectedMedicationRequest, setSelectedMedicationRequest] = useState(null); // const [showDisplayModal, setShowDisplayModal] = useState(false); // const spacerMargin = '24px'; // useFhirMedicationRequestBroadcast(); // useFhirMedicationRequestTargetedBroadcast({ // medicationRequest: selectedMedicationRequest || undefined, // isOpen: showDisplayModal, // onUpdate: (updatedMedicationRequest) => { // setSelectedMedicationRequest(updatedMedicationRequest); // }, // onDelete: () => { // setShowDisplayModal(false); // setSelectedMedicationRequest(null); // } // }); // const viewMedicationRequest = (medicationRequest: MedicationRequest) => { // setSelectedMedicationRequest(medicationRequest); // setShowDisplayModal(true); // }; // const editMedicationRequest = (event: React.MouseEvent, medicationRequest: MedicationRequest) => { // event.stopPropagation(); // navigate(medicationRequest.id as string, { relative: 'path' }); // }; // const addMedicationRequest = () => { // navigate('new', { relative: 'path' }); // }; // const isAuthorizedToEdit = () => { // return userRole && [USER_ROLES.PRACTITIONER].includes(userRole as string); // }; // const getStatusDisplay = (medicationRequest: MedicationRequest): { isActive: boolean, text: string, color?: string } => { // if (!medicationRequest) return { isActive: false, text: '' }; // switch (medicationRequest.status) { // case 'active': // return { isActive: true, text: 'Active', color: '#00a32a' }; // case 'on-hold': // return { isActive: false, text: 'On Hold', color: '#e39700' }; // case 'cancelled': // return { isActive: false, text: 'Cancelled', color: '#cc1818' }; // case 'completed': // return { isActive: false, text: 'Completed', color: '#4f94d4' }; // case 'entered-in-error': // return { isActive: false, text: 'Error', color: '#cc1818' }; // case 'stopped': // return { isActive: false, text: 'Stopped', color: '#cc1818' }; // case 'draft': // return { isActive: false, text: 'Draft', color: '#757575' }; // case 'unknown': // default: // return { isActive: false, text: 'Unknown' }; // } // }; // return ( // // setIsGuideOpen(false)} // resourceType="MedicationRequest"/> // // // // // // // {isAuthorizedToEdit() && ( // // // // )} // // // {error && ( // <> // // {error} // // // // )} // {!loading && medicationRequestsList.length === 0 && ( // <> // // No medication requests found. // // // // )} // <> // {loading ? ( // // ): ( // // {medicationRequestsList.length !== 0 && ( // // {medicationRequestsList.map((medicationRequest: MedicationRequest) => { // const displayTitle = getMedicationRequestDisplay(medicationRequest); // const dosageCount = medicationRequest.dosageInstruction?.length || 0; // const { isActive, text: statusText, color: statusColor } = getStatusDisplay(medicationRequest); // const intent = medicationRequest.intent; // return ( // viewMedicationRequest(medicationRequest)}> // // // // // // // // // {displayTitle} // // {dosageCount > 0 && ( // // {dosageCount} dosage{dosageCount !== 1 ? 's': ''} // // )} // {intent && ( // // Intent: {intent} // // )} // // {isAuthorizedToEdit() && ( // // // // )} // // // // // ); // })} // // )} // // )} // // {selectedMedicationRequest && ( // { // setShowDisplayModal(false); // setSelectedMedicationRequest(null); // }} // /> // )} // // ); // }; // export default MedicationRequests;