fix(05-jamtrack): implement pickMyPackage logic for mixdown selection

The downloadJamTrack thunk was failing with "No mixdown package available"
because it was trying to access mixdowns[0].packageId directly. Mixdowns
have a packages array, and the correct package must be selected based on
client capabilities (pickMyPackage logic from legacy implementation).

Changes to downloadJamTrack thunk:
- Get client sample rate via jamClient.GetSampleRate()
- Find mixdown by mixdownId if provided, else use first mixdown
- Implement pickMyPackage logic to find compatible package:
  * file_type === 'ogg'
  * encrypt_type === 'jkz'
  * sample_rate === clientSampleRate (44 or 48 kHz)
- Extract packageId from selected package
- Add detailed error messages for each failure case

This matches the legacy JamTrackStore.pickMyPackage() behavior documented
in .planning/codebase/JAMTRACK_LEGACY.md lines 126-130.

Fixes "No mixdown package available" error during JamTrack playback.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Nuwan 2026-01-15 01:58:00 +05:30
parent 40cb7fe908
commit 8681b2d3bd
1 changed files with 29 additions and 6 deletions

View File

@ -59,15 +59,38 @@ export const downloadJamTrack = createAsyncThunk(
progress: 0
}));
// Get package ID (simplified - use first available package)
// Real implementation would use pickMyPackage() logic from legacy
const mixdowns = await jamClient.JamTrackGetMixdowns(jamTrack.id);
const packageId = mixdowns && mixdowns.length > 0 ? mixdowns[0].packageId : null;
// Get client sample rate for package selection (pickMyPackage logic)
const sampleRate = await jamClient.GetSampleRate();
if (!packageId) {
throw new Error('No mixdown package available');
// Get mixdowns and find compatible package
const mixdowns = await jamClient.JamTrackGetMixdowns(jamTrack.id);
if (!mixdowns || mixdowns.length === 0) {
throw new Error('No mixdowns available for this JamTrack');
}
// Find the first mixdown (use selected mixdownId if provided, else use first)
const mixdown = mixdownId
? mixdowns.find(m => m.id === mixdownId) || mixdowns[0]
: mixdowns[0];
if (!mixdown || !mixdown.packages || mixdown.packages.length === 0) {
throw new Error('Mixdown has no packages available');
}
// pickMyPackage logic: find compatible package (ogg, jkz, matching sample rate)
const compatiblePackage = mixdown.packages.find(pkg =>
pkg.file_type === 'ogg' &&
pkg.encrypt_type === 'jkz' &&
pkg.sample_rate === sampleRate
);
if (!compatiblePackage) {
throw new Error(`No compatible package found for sample rate ${sampleRate}kHz`);
}
const packageId = compatiblePackage.id;
// Set up global callbacks for native client
window.jamTrackDownloadProgress = (percent) => {
dispatch(setDownloadState({ progress: percent }));