import React, { useState } from "react"; import { Practitioner, PractitionerRole } from "fhir/r4"; import { FhirCodeableConceptDisplay } from "../../utils/fhirCodeableConcept"; import { FHIRAddressDisplay } from "../../utils/fhirAddress"; import { FHIRContactPointDisplay } from "../../utils/fhirContactPoint"; import { FhirIdentifierDisplay } from "../../utils/fhirIdentifier"; import { FhirReferenceDisplay } from "../../utils/fhirReference"; import { FhirPeriodDisplay } from "../../utils/fhirPeriod"; import { FhirOperationalHoursDisplay } from "../../utils/fhirOperationalHours"; import { formatDate } from "../../utils/dateUtils"; import { ProfilePhoto } from "../index.ts"; import { useAuthServiceContext } from "../../services"; import { FhirPractitionerRoleDisplay } from "../../components"; import { Dialog, DialogContent, DialogTitle } from "../ui/dialog"; import { CalendarCheck2, Clock4, Hospital, MessageSquareText, Stethoscope, UserRoundPlus, } from "lucide-react"; import { CardTitle, CardDescription, Card, CardContent, CardHeader, } from "../ui/card.tsx"; import { Button } from "../ui/button.tsx"; import { Link } from "react-router-dom"; import { isPatientFacingPractitionerRole } from "../../utils/staffRoleCatalog.ts"; import { formatFhirHumanName } from "../../utils/fhirHumanName.tsx"; import { FieldHistoryProvider, FieldHistoryScope, } from "../FieldHistory/FieldHistoryProvider"; import { ShowFieldHistoryToggle } from "../FieldHistory/ShowFieldHistoryToggle"; import { RecordEditedMarker } from "../FieldHistory/RecordEditedMarker"; import { Field } from "../FieldHistory/Field"; import { FieldGroup, Section } from "../FieldHistory/FieldLayout"; interface FhirPractitionerDisplayProps { practitioner: Practitioner; roles?: PractitionerRole[]; isOpen?: boolean; onClose?: () => void; title?: string; asModal?: boolean; showRoles?: boolean; // Chat and Book Appointment open the READER's own patient portal; a staff reader is not booking a colleague. showPatientActions?: boolean; } const renderYesNo = (value: boolean | undefined): string | undefined => { if (value === undefined) return undefined; return value ? "Yes" : "No"; }; export const FhirPractitionerDisplay: React.FC< FhirPractitionerDisplayProps > = ({ practitioner, roles, isOpen = true, onClose, title = "Practitioner Details", asModal = true, showRoles = false, showPatientActions = true, }) => { const { getCognitoGroup } = useAuthServiceContext(); const [segment, setSegment] = useState<"practitioner" | "roles">( "practitioner", ); const getPrimaryRole = () => { if (!roles || roles.length === 0) return null; return roles[0]; }; const renderLanguagesValue = () => { if ( !practitioner?.communication || practitioner.communication.length === 0 ) { return undefined; } return ( ); }; const renderQualifications = (): React.ReactNode => { if ( !practitioner.qualification || practitioner.qualification.length === 0 ) { return (

No qualifications recorded

); } return (
{practitioner.qualification.map((qualification, index) => ( Qualification {index + 1} } /> } /> } /> } /> ))}
); }; const renderContent = () => { const primaryRole = getPrimaryRole(); const fullName = formatFhirHumanName(practitioner?.name, { emptyText: "Unknown Practitioner", }); const roleName = primaryRole?.code?.[0]?.text || "Practitioner"; const orgName = primaryRole?.organization?.display || "Organization"; return (

{title}

{fullName}

{roleName}
{orgName} {practitioner?.gender} Practitioner
} /> } /> } />
{renderQualifications()}
Availability
{showPatientActions &&
}
); }; const renderContentWithRoles = () => { return ( <>
{segment === "practitioner" && renderContent()} {segment === "roles" && (
{roles ?.filter((practitionerRole: PractitionerRole) => isPatientFacingPractitionerRole( practitionerRole, getCognitoGroup(practitionerRole), ), ) .map((practitionerRole: PractitionerRole, index: number) => (
))}
)}
); }; if (!asModal) { return (
{showRoles ? renderContentWithRoles() : renderContent()}
); } if (!isOpen) return null; return ( { if (!next) onClose?.(); }} > {title} {showRoles ? renderContentWithRoles() : renderContent()} ); }; export default FhirPractitionerDisplay;