import { useEffect } from 'react'; import { QuestionnaireResponse } from 'fhir/r4'; import { usePatientServiceContext, useWebSocketServiceContext } from '../services'; interface UseQuestionnaireResponseWebSocketOptions { questionnaireResponse?: QuestionnaireResponse; questionnaireResponseId?: string; isOpen?: boolean; onUpdate: (questionnaireResponse: QuestionnaireResponse) => void; onDelete: () => void; } export const useFhirQuestionnaireResponseTargetedBroadcast = ({ questionnaireResponse, questionnaireResponseId, isOpen = true, onUpdate, onDelete }: UseQuestionnaireResponseWebSocketOptions) => { const { subscribe, unsubscribe } = useWebSocketServiceContext(); const { patientState } = usePatientServiceContext(); useEffect(() => { if (!patientState || !questionnaireResponse || !isOpen) { return; } const handleQuestionnaireResponseEvent = (cloudEvent: any) => { const questionnaireResponsePayload: QuestionnaireResponse = cloudEvent.data; const eventType = cloudEvent.type; const targetId = questionnaireResponseId || questionnaireResponse.id; if (questionnaireResponsePayload.id === targetId) { switch (eventType) { case 'com.akashichealthrecords.fhir.questionnaireresponse.updated': onUpdate(questionnaireResponsePayload); break; case 'com.akashichealthrecords.fhir.questionnaireresponse.deleted': onDelete(); break; } } }; subscribe('com.akashichealthrecords.fhir.questionnaireresponse.updated', handleQuestionnaireResponseEvent); subscribe('com.akashichealthrecords.fhir.questionnaireresponse.deleted', handleQuestionnaireResponseEvent); return () => { unsubscribe('com.akashichealthrecords.fhir.questionnaireresponse.updated', handleQuestionnaireResponseEvent); unsubscribe('com.akashichealthrecords.fhir.questionnaireresponse.deleted', handleQuestionnaireResponseEvent); }; }, [patientState, questionnaireResponse, questionnaireResponseId, isOpen, onUpdate, onDelete, subscribe, unsubscribe]); };