From 3d847ece7fcc956ad9671dddb4918020b71b58fe Mon Sep 17 00:00:00 2001 From: Nuwan Date: Thu, 26 Feb 2026 11:52:53 +0530 Subject: [PATCH] fix(26): pass jamServer to loadJamTrack and improve error handling - Add jamServer to useMediaActions by creating object from subscribe/unsubscribe - Pass jamServer to loadJamTrackThunk so it can subscribe to packaging progress - Improve error handling to extract message from Response objects (not just Error) - Fixes "Failed to start packaging: undefined" error Co-Authored-By: Claude Opus 4.5 --- jam-ui/src/hooks/useMediaActions.js | 14 ++++++++++---- jam-ui/src/store/features/mediaSlice.js | 4 +++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/jam-ui/src/hooks/useMediaActions.js b/jam-ui/src/hooks/useMediaActions.js index defacc29e..91a9634a8 100644 --- a/jam-ui/src/hooks/useMediaActions.js +++ b/jam-ui/src/hooks/useMediaActions.js @@ -1,4 +1,4 @@ -import { useCallback } from 'react'; +import { useCallback, useMemo } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { openBackingTrack as openBackingTrackThunk, @@ -32,7 +32,13 @@ import { syncTracksToServer } from '../services/trackSyncService'; const useMediaActions = () => { const dispatch = useDispatch(); const sessionId = useSelector(selectSessionId); - const { jamClient } = useJamServerContext(); + const { jamClient, subscribe, unsubscribe } = useJamServerContext(); + + // Create jamServer object with subscribe/unsubscribe for thunks + const jamServer = useMemo(() => ({ + subscribe, + unsubscribe + }), [subscribe, unsubscribe]); /** * Open a backing track file @@ -144,7 +150,7 @@ const useMediaActions = () => { */ const loadJamTrack = useCallback(async (jamTrack) => { try { - await dispatch(loadJamTrackThunk({ jamTrack, jamClient })).unwrap(); + await dispatch(loadJamTrackThunk({ jamTrack, jamClient, jamServer })).unwrap(); // Update media summary dispatch(updateMediaSummary({ @@ -161,7 +167,7 @@ const useMediaActions = () => { console.error('Error loading jam track:', error); throw error; } - }, [dispatch, jamClient, sessionId]); + }, [dispatch, jamClient, jamServer, sessionId]); /** * Stop and close the currently playing JamTrack diff --git a/jam-ui/src/store/features/mediaSlice.js b/jam-ui/src/store/features/mediaSlice.js index 8270d9103..33c1d9780 100644 --- a/jam-ui/src/store/features/mediaSlice.js +++ b/jam-ui/src/store/features/mediaSlice.js @@ -148,7 +148,9 @@ export const downloadJamTrack = createAsyncThunk( }); } catch (err) { console.error('[JamTrack] Failed to enqueue mixdown:', err); - throw new Error(`Failed to start packaging: ${err.message}`); + // Handle both Error objects and Response objects (from apiFetch) + const errorMessage = err?.message || err?.statusText || `HTTP ${err?.status}` || 'Unknown error'; + throw new Error(`Failed to start packaging: ${errorMessage}`); } // Subscribe to WebSocket notifications for packaging progress