import { useEffect } from 'react'; import { Procedure } from 'fhir/r4'; import { usePatientServiceContext, useWebSocketServiceContext } from '../services'; interface UseProcedureWebSocketOptions { procedure?: Procedure; procedureId?: string; isOpen?: boolean; onUpdate: (procedure: Procedure) => void; onDelete: () => void; } export const useFhirProcedureTargetedBroadcast = ({ procedure, procedureId, isOpen = true, onUpdate, onDelete }: UseProcedureWebSocketOptions) => { const { subscribe, unsubscribe } = useWebSocketServiceContext(); const { patientState } = usePatientServiceContext(); useEffect(() => { if (!patientState || !procedure || !isOpen) { return; } const handleProcedureEvent = (cloudEvent: any) => { const procedurePayload: Procedure = cloudEvent.data; const eventType = cloudEvent.type; const targetId = procedureId || procedure.id; if (procedurePayload.id === targetId) { switch (eventType) { case 'com.akashichealthrecords.fhir.procedure.updated': onUpdate(procedurePayload); break; case 'com.akashichealthrecords.fhir.procedure.deleted': onDelete(); break; } } }; subscribe('com.akashichealthrecords.fhir.procedure.updated', handleProcedureEvent); subscribe('com.akashichealthrecords.fhir.procedure.deleted', handleProcedureEvent); return () => { unsubscribe('com.akashichealthrecords.fhir.procedure.updated', handleProcedureEvent); unsubscribe('com.akashichealthrecords.fhir.procedure.deleted', handleProcedureEvent); }; }, [patientState, procedure, procedureId, isOpen, onUpdate, onDelete, subscribe, unsubscribe]); };