From a88beb3f4e17367a2be37182eda413acd8f0ac62 Mon Sep 17 00:00:00 2001 From: Nuwan Date: Fri, 16 Jan 2026 13:06:20 +0530 Subject: [PATCH] fix(05-03): register alert callback to receive backend mixer changes PROBLEM: - onBackendMixerChanged never being called - No [HandleAlertCallback] logs - Backing track changes not triggering session refresh ROOT CAUSE: - Alert callback never registered with native client - In legacy code: jamClient.SessionSetAlertCallback("JK.AlertCallback") - React app had no equivalent setup - Backend mixer change alerts (type=2) never delivered to app - So onBackendMixerChanged never called, session never refreshed SOLUTION: 1. Add JK.HandleAlertCallback global function in JKSessionScreen 2. Routes BACKEND_MIXER_CHANGE (type=2) to sessionModel.onBackendMixerChanged 3. Register callback with jamClient.SessionSetAlertCallback on session join 4. Unregister callback on session leave for cleanup FLOW NOW: 1. User opens backing track via jamClient 2. Native client detects change 3. Native client calls JK.HandleAlertCallback(type=2, 'RebuildMediaControl') 4. Handler routes to sessionModel.onBackendMixerChanged() 5. Syncs tracks and calls refreshCurrentSession() 6. REST API returns session with participants[].backing_tracks 7. updateSessionInfo() extracts and dispatches to Redux 8. mixerHelper.backingTracks populated 9. Component displays backing track Co-Authored-By: Claude Sonnet 4.5 --- .../src/components/client/JKSessionScreen.js | 28 +++++++++++++++++++ jam-ui/src/hooks/useSessionModel.js | 1 + 2 files changed, 29 insertions(+) diff --git a/jam-ui/src/components/client/JKSessionScreen.js b/jam-ui/src/components/client/JKSessionScreen.js index a1d53294a..15a91e8c0 100644 --- a/jam-ui/src/components/client/JKSessionScreen.js +++ b/jam-ui/src/components/client/JKSessionScreen.js @@ -266,6 +266,33 @@ const JKSessionScreen = () => { } }, [sessionIdFromUrl, sessionId, dispatch]); + // Setup global alert callback handler for backend mixer changes + useEffect(() => { + if (!window.JK) window.JK = {}; + + // Alert callback handler - routes backend alerts to appropriate handlers + window.JK.HandleAlertCallback = (type, text) => { + console.log('[HandleAlertCallback] Alert received:', { type, text }); + + // BACKEND_MIXER_CHANGE = 2 + if (type === 2) { + console.log('[HandleAlertCallback] BACKEND_MIXER_CHANGE detected:', text); + if (sessionModel && sessionModel.onBackendMixerChanged) { + sessionModel.onBackendMixerChanged(type, text); + } else { + console.warn('[HandleAlertCallback] sessionModel.onBackendMixerChanged not available'); + } + } + // Handle other alert types as needed + }; + + return () => { + if (window.JK) { + delete window.JK.HandleAlertCallback; + } + }; + }, [sessionModel]); + useEffect(() => { if (!isConnected || !jamClient) return; console.debug("JKSessionScreen: -DEBUG- isConnected changed to true"); @@ -357,6 +384,7 @@ const JKSessionScreen = () => { const joinSession = async () => { await jamClient.SessionRegisterCallback("JK.HandleBridgeCallback2"); + await jamClient.SessionSetAlertCallback("JK.HandleAlertCallback"); await jamClient.RegisterRecordingCallbacks("JK.HandleRecordingStartResult", "JK.HandleRecordingStopResult", "JK.HandleRecordingStarted", "JK.HandleRecordingStopped", "JK.HandleRecordingAborted"); await jamClient.SessionSetConnectionStatusRefreshRate(1000); diff --git a/jam-ui/src/hooks/useSessionModel.js b/jam-ui/src/hooks/useSessionModel.js index 453b1e4cf..8a4c55b95 100644 --- a/jam-ui/src/hooks/useSessionModel.js +++ b/jam-ui/src/hooks/useSessionModel.js @@ -493,6 +493,7 @@ export default function useSessionModel(app, server, sessionScreen) { // Unregister callbacks try { await jamClient.SessionRegisterCallback(""); + await jamClient.SessionSetAlertCallback(""); await jamClient.SessionSetConnectionStatusRefreshRate(0); logger.debug("Callbacks unregistered successfully"); } catch (error) {