import { useEffect } from 'react'; import { PractitionerRole } from 'fhir/r4'; import { usePractitionerServiceContext, useWebSocketServiceContext } from '../services'; interface UsePractitionerRoleWebSocketOptions { practitionerRole?: PractitionerRole; practitionerRoleId?: string; isOpen?: boolean; onUpdate: (practitionerRole: PractitionerRole) => void; onDelete: () => void; } export const useFhirPractitionerRoleTargetedBroadcast = ({ practitionerRole, practitionerRoleId, isOpen = true, onUpdate, onDelete }: UsePractitionerRoleWebSocketOptions) => { const { subscribe, unsubscribe } = useWebSocketServiceContext(); const { practitionerState } = usePractitionerServiceContext(); useEffect(() => { if (!practitionerState || !practitionerRole || !isOpen) { return; } const handlePractitionerRoleEvent = (cloudEvent: any) => { const practitionerRolePayload: PractitionerRole = cloudEvent.data; const eventType = cloudEvent.type; const targetId = practitionerRoleId || practitionerRole.id; if (practitionerRolePayload.id === targetId) { switch (eventType) { case 'com.akashichealthrecords.fhir.practitionerrole.updated': onUpdate(practitionerRolePayload); break; case 'com.akashichealthrecords.fhir.practitionerrole.deleted': onDelete(); break; } } }; subscribe('com.akashichealthrecords.fhir.practitionerrole.updated', handlePractitionerRoleEvent); subscribe('com.akashichealthrecords.fhir.practitionerrole.deleted', handlePractitionerRoleEvent); return () => { unsubscribe('com.akashichealthrecords.fhir.practitionerrole.updated', handlePractitionerRoleEvent); unsubscribe('com.akashichealthrecords.fhir.practitionerrole.deleted', handlePractitionerRoleEvent); }; }, [practitionerState, practitionerRole, practitionerRoleId, isOpen, onUpdate, onDelete, subscribe, unsubscribe]); };