import { useEffect } from 'react'; import { ImmunizationRecommendation } from 'fhir/r4'; import { usePatientServiceContext, useWebSocketServiceContext } from '../services'; interface UseImmunizationRecommendationWebSocketOptions { immunizationRecommendation?: ImmunizationRecommendation; immunizationRecommendationId?: string; isOpen?: boolean; onUpdate: (immunizationRecommendation: ImmunizationRecommendation) => void; onDelete: () => void; } export const useFhirImmunizationRecommendationTargetedBroadcast = ({ immunizationRecommendation, immunizationRecommendationId, isOpen = true, onUpdate, onDelete }: UseImmunizationRecommendationWebSocketOptions) => { const { subscribe, unsubscribe } = useWebSocketServiceContext(); const { patientState } = usePatientServiceContext(); useEffect(() => { if (!patientState || !immunizationRecommendation || !isOpen) { return; } const handleImmunizationRecommendationEvent = (cloudEvent: any) => { const immunizationRecommendationPayload: ImmunizationRecommendation = cloudEvent.data; const eventType = cloudEvent.type; const targetId = immunizationRecommendationId || immunizationRecommendation.id; if (immunizationRecommendationPayload.id === targetId) { switch (eventType) { case 'com.akashichealthrecords.fhir.immunizationrecommendation.updated': onUpdate(immunizationRecommendationPayload); break; case 'com.akashichealthrecords.fhir.immunizationrecommendation.deleted': onDelete(); break; } } }; subscribe('com.akashichealthrecords.fhir.immunizationrecommendation.updated', handleImmunizationRecommendationEvent); subscribe('com.akashichealthrecords.fhir.immunizationrecommendation.deleted', handleImmunizationRecommendationEvent); return () => { unsubscribe('com.akashichealthrecords.fhir.immunizationrecommendation.updated', handleImmunizationRecommendationEvent); unsubscribe('com.akashichealthrecords.fhir.immunizationrecommendation.deleted', handleImmunizationRecommendationEvent); }; }, [patientState, immunizationRecommendation, immunizationRecommendationId, isOpen, onUpdate, onDelete, subscribe, unsubscribe]); };