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 <noreply@anthropic.com>
This commit is contained in:
Nuwan 2026-01-16 13:06:20 +05:30
parent e4651ae1cb
commit a88beb3f4e
2 changed files with 29 additions and 0 deletions

View File

@ -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);

View File

@ -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) {