From 701410715269039d9ccf7d106b55d501afc5b918 Mon Sep 17 00:00:00 2001 From: Nuwan Date: Thu, 15 Jan 2026 00:59:11 +0530 Subject: [PATCH] feat(05-04): fetch and organize mixdowns in player initialization - Add JamTrackGetMixdowns API call during player initialization - Organize mixdowns into master/customMixes/stems hierarchy - Store availableMixdowns in Redux (activeSessionSlice) - Set default mixdown selection (prefer master, fallback to first) - Set activeMixdown in Redux for UI display - Non-fatal error handling (can play without explicit selection) Co-Authored-By: Claude Sonnet 4.5 --- .../client/JKSessionJamTrackPlayer.js | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/jam-ui/src/components/client/JKSessionJamTrackPlayer.js b/jam-ui/src/components/client/JKSessionJamTrackPlayer.js index eae14dcc2..0a2c23f99 100644 --- a/jam-ui/src/components/client/JKSessionJamTrackPlayer.js +++ b/jam-ui/src/components/client/JKSessionJamTrackPlayer.js @@ -7,6 +7,7 @@ import { setJamTrackState } from '../../store/features/mediaSlice'; import { setOpenJamTrack, clearOpenJamTrack } from '../../store/features/sessionUISlice'; +import { setAvailableMixdowns, setActiveMixdown } from '../../store/features/activeSessionSlice'; const JKSessionJamTrackPlayer = ({ isOpen, @@ -65,6 +66,40 @@ const JKSessionJamTrackPlayer = ({ console.log('[JamTrack] Not synchronized, will download'); } + // Fetch available mixdowns + try { + const mixdowns = await jamClient.JamTrackGetMixdowns(jamTrack.id); + + if (mixdowns && mixdowns.length > 0) { + // Organize into hierarchy: master, custom mixes, stems + const organized = { + master: mixdowns.find(m => m.type === 'master') || null, + customMixes: mixdowns.filter(m => m.type === 'custom' || m.type === 'custom-mix'), + stems: mixdowns.filter(m => m.type === 'stem') + }; + + dispatch(setAvailableMixdowns(mixdowns)); + + // Set initial mixdown if not already selected + if (!selectedMixdownId) { + const defaultMixdown = organized.master || (mixdowns[0] || null); + if (defaultMixdown) { + setSelectedMixdownId(defaultMixdown.id); + dispatch(setActiveMixdown(defaultMixdown)); + } + } else { + // Find and set the initially selected mixdown + const mixdown = mixdowns.find(m => m.id === selectedMixdownId); + if (mixdown) { + dispatch(setActiveMixdown(mixdown)); + } + } + } + } catch (err) { + console.error('[JamTrack] Failed to fetch mixdowns:', err); + // Non-fatal - can still play default mixdown + } + // Set open in Redux dispatch(setOpenJamTrack(jamTrack.id));