import React from 'react'; import type { CommunicationRequest } from 'fhir/r4'; import { useAuthServiceContext, useCommunicationServiceContext, useFhirServiceContext, } from '../services'; import { useInboxThreads } from './useInboxThreads'; import { counterpartyReference } from '../utils/messaging/poolThread'; import { inboxUnreadCount } from '../utils/messaging/inboxUnread'; import { useColleagueInboxRows } from '../pages/DashboardPage/StaffMessagesPage/panels/useColleagueInboxRows'; // Unread across the desk's patient conversations; undefined while unknown. export const useDeskPatientInboxUnread = (): number | undefined => { const { currentUser } = useAuthServiceContext(); const { extractReferenceId } = useFhirServiceContext(); const { patientCommunicationRequests, getMessagesForRequest, getUnreadCountForRequest, threadListingFailed } = useCommunicationServiceContext(); const selfId = currentUser?.fhir?.id; const patientCounterpartyId = React.useCallback( (request: CommunicationRequest) => extractReferenceId(counterpartyReference(request, selfId)) as string | undefined, [selfId, extractReferenceId], ); const { inboxThreads } = useInboxThreads(patientCommunicationRequests, patientCounterpartyId, { getMessagesForRequest, getUnreadCountForRequest, }); return inboxUnreadCount(inboxThreads, getUnreadCountForRequest, !!threadListingFailed); }; // Unread across the colleague conversations the Inbox lists. export const useColleagueInboxUnread = (enabled = true): number => useColleagueInboxRows(enabled).reduce((total, row) => total + row.unread, 0); export const deskInboxUnread = (patient: number | undefined, colleague: number): number | undefined => patient === undefined ? undefined : patient + colleague; // Unread messages across every conversation the desk inbox lists; undefined while unknown. export const useDeskInboxUnread = (): number | undefined => deskInboxUnread(useDeskPatientInboxUnread(), useColleagueInboxUnread());