import { useEffect } from 'react'; import { Coverage } from 'fhir/r4'; import { useCoverageServiceContext, useFhirServiceContext, usePatientServiceContext, useWebSocketServiceContext } from '../services'; import { isArchived } from '../utils/archivedResource'; const CREATED = 'com.akashichealthrecords.fhir.coverage.created'; const UPDATED = 'com.akashichealthrecords.fhir.coverage.updated'; const DELETED = 'com.akashichealthrecords.fhir.coverage.deleted'; // Keeps the insurance list of the patient on screen current; another patient's event is ignored. export const useFhirCoverageBroadcast = () => { const { subscribe, unsubscribe } = useWebSocketServiceContext(); const { setCoverageList } = useCoverageServiceContext(); const { patientState } = usePatientServiceContext(); const { extractReferenceId } = useFhirServiceContext(); useEffect(() => { if (!patientState) { return; } const handleCoverageEvent = (cloudEvent: any) => { const coverage: Coverage = cloudEvent.data; if (!coverage?.id || extractReferenceId(coverage.beneficiary) !== patientState.id) return; switch (cloudEvent.type) { case CREATED: // The refetch after a save may already hold it; replace rather than append twice. setCoverageList(prev => prev.some(p => p.id === coverage.id) ? prev.map(p => p.id === coverage.id ? coverage : p) : [...prev, coverage] ); break; case UPDATED: setCoverageList(prev => { if (isArchived(coverage)) return prev.filter(p => p.id !== coverage.id); return prev.some(p => p.id === coverage.id) ? prev.map(p => p.id === coverage.id ? coverage : p) : [...prev, coverage]; }); break; case DELETED: setCoverageList(prev => prev.filter(p => p.id !== coverage.id)); break; } }; subscribe(CREATED, handleCoverageEvent); subscribe(UPDATED, handleCoverageEvent); subscribe(DELETED, handleCoverageEvent); return () => { unsubscribe(CREATED, handleCoverageEvent); unsubscribe(UPDATED, handleCoverageEvent); unsubscribe(DELETED, handleCoverageEvent); }; }, [patientState, subscribe, unsubscribe, extractReferenceId, setCoverageList]); };