import { scannedPhotoSrc } from '../../../../utils/fhirPhoto'; import React from 'react'; import type { CommunicationRequest } from 'fhir/r4'; import { useAuthServiceContext, useCommunicationServiceContext, useFhirServiceContext, } from '../../../../services'; import { useInboxThreads } from '../../../../hooks/useInboxThreads'; import { useColleagueDirectory } from '../../../../hooks/useColleagueDirectory'; import { formatFhirHumanName } from '../../../../utils/fhirHumanName.tsx'; import { threadLastActivity, threadPreview } from '../../../../utils/threadSummary'; import { WITHHELD_COLLEAGUE_NAME } from '../../../../utils/staff/withheldColleague'; export type ColleagueInboxRow = { request: CommunicationRequest; name: string; photoUrl?: string; preview: string; lastActivity: number; unread: number; }; // The desk's colleague conversations as inbox rows, read the way the Colleagues panel reads them. export const useColleagueInboxRows = (enabled: boolean): ColleagueInboxRow[] => { const { currentUser } = useAuthServiceContext(); const { list: practitionersList } = useColleagueDirectory({ enabled }); const { extractReferenceId } = useFhirServiceContext(); const { staffCommunicationRequests, getMessagesForRequest, getUnreadCountForRequest, } = useCommunicationServiceContext(); const selfId = currentUser?.fhir?.id; const getCounterpartyId = React.useCallback( (request: CommunicationRequest): string | undefined => { const senderId = extractReferenceId(request.sender) as string | undefined; if (senderId === selfId) return extractReferenceId(request.recipient?.[0]) as string | undefined; return senderId; }, [selfId, extractReferenceId], ); const { inboxThreads } = useInboxThreads( enabled ? staffCommunicationRequests : [], getCounterpartyId, { getMessagesForRequest, getUnreadCountForRequest }, ); return React.useMemo(() => inboxThreads.map((request) => { const counterpartyId = getCounterpartyId(request); const practitioner = practitionersList.find((entry) => entry.practitioner.id === counterpartyId)?.practitioner; const photo = practitioner?.photo?.[0]; const messages = getMessagesForRequest(request); return { request, name: (practitioner?.name && formatFhirHumanName(practitioner.name)) || WITHHELD_COLLEAGUE_NAME, photoUrl: scannedPhotoSrc(photo), preview: threadPreview(messages), lastActivity: threadLastActivity(messages), unread: getUnreadCountForRequest(request.id as string), }; }), [inboxThreads, getCounterpartyId, practitionersList, getMessagesForRequest, getUnreadCountForRequest]); };