fix: loadAudioBuffersForTracks scoped in ProfileModal crashes project load

Move fn to App component scope, pass as prop to ProfileModal.
restoreLastSessionProject now has access on startup.
This commit is contained in:
2026-07-30 20:40:25 +07:00
parent 3386a2b4c2
commit 313d1be5af
3 changed files with 115 additions and 76 deletions
+68 -66
View File
@@ -4487,7 +4487,8 @@ const ProfileModal = ({
setProjectName,
currentProjectId,
setCurrentProjectId,
showToast
showToast,
loadAudioBuffersForTracks
}) => {
if (!isOpen) return null;
const [activeTab, setActiveTab] = useState('account');
@@ -4573,70 +4574,6 @@ const ProfileModal = ({
}
};
const loadAudioBuffersForTracks = async (tracksList) => {
let hasLoadedAny = false;
const updatedTracks = await Promise.all(tracksList.map(async t => {
let trackBuffer = t.buffer;
let trackChannelInfo = t.channelInfo;
if (t.serverFileId && !trackBuffer) {
try {
const res = await fetch('/static/audio/uploads/' + t.serverFileId);
if (res.ok) {
const blob = await res.blob();
const { audioBuffer, channelInfo } = await window.SonicAudio.decodeAudioFile(blob);
trackBuffer = audioBuffer;
trackChannelInfo = channelInfo;
hasLoadedAny = true;
}
} catch (e) {
console.warn("Failed to autoload track buffer for " + t.serverFileId, e);
}
}
let clipsUpdated = false;
const updatedClips = await Promise.all((t.clips || []).map(async c => {
let clipBuffer = c.buffer;
const targetFileId = c.serverFileId || t.serverFileId;
if (targetFileId && !clipBuffer) {
try {
const res = await fetch('/static/audio/uploads/' + targetFileId);
if (res.ok) {
const blob = await res.blob();
const { audioBuffer } = await window.SonicAudio.decodeAudioFile(blob);
clipBuffer = audioBuffer;
clipsUpdated = true;
hasLoadedAny = true;
}
} catch (e) {
console.warn("Failed to autoload clip buffer for " + targetFileId, e);
}
}
return { ...c, buffer: clipBuffer };
}));
if (trackBuffer && updatedClips.length === 0) {
const clipId = `default_${t.id}`;
return {
...t,
buffer: trackBuffer,
channelInfo: trackChannelInfo,
clips: [{ id: clipId, buffer: trackBuffer, startTime: t.startTime || 0, name: t.name, speed: 1.0 }]
};
}
return {
...t,
buffer: trackBuffer,
channelInfo: trackChannelInfo,
clips: updatedClips
};
}));
if (hasLoadedAny) {
setTracks(updatedTracks);
}
};
const handleOpenProject = async (projectId, projectName) => {
setAppWarningModal({
title: "Mở dự án",
@@ -9799,6 +9736,70 @@ const App = () => {
const [pluginManagerModalOpen, setPluginManagerModalOpen] = useState(false);
const [pluginsData, setPluginsData] = useState(null);
const loadAudioBuffersForTracks = async (tracksList) => {
let hasLoadedAny = false;
const updatedTracks = await Promise.all(tracksList.map(async t => {
let trackBuffer = t.buffer;
let trackChannelInfo = t.channelInfo;
if (t.serverFileId && !trackBuffer) {
try {
const res = await fetch('/static/audio/uploads/' + t.serverFileId);
if (res.ok) {
const blob = await res.blob();
const { audioBuffer, channelInfo } = await window.SonicAudio.decodeAudioFile(blob);
trackBuffer = audioBuffer;
trackChannelInfo = channelInfo;
hasLoadedAny = true;
}
} catch (e) {
console.warn("Failed to autoload track buffer for " + t.serverFileId, e);
}
}
let clipsUpdated = false;
const updatedClips = await Promise.all((t.clips || []).map(async c => {
let clipBuffer = c.buffer;
const targetFileId = c.serverFileId || t.serverFileId;
if (targetFileId && !clipBuffer) {
try {
const res = await fetch('/static/audio/uploads/' + targetFileId);
if (res.ok) {
const blob = await res.blob();
const { audioBuffer } = await window.SonicAudio.decodeAudioFile(blob);
clipBuffer = audioBuffer;
clipsUpdated = true;
hasLoadedAny = true;
}
} catch (e) {
console.warn("Failed to autoload clip buffer for " + targetFileId, e);
}
}
return { ...c, buffer: clipBuffer };
}));
if (trackBuffer && updatedClips.length === 0) {
const clipId = `default_${t.id}`;
return {
...t,
buffer: trackBuffer,
channelInfo: trackChannelInfo,
clips: [{ id: clipId, buffer: trackBuffer, startTime: t.startTime || 0, name: t.name, speed: 1.0 }]
};
}
return {
...t,
buffer: trackBuffer,
channelInfo: trackChannelInfo,
clips: updatedClips
};
}));
if (hasLoadedAny) {
setTracks(updatedTracks);
}
};
const restoreLastSessionProject = async () => {
var pendingWasNull = !window.__pendingSfsProject;
loadPendingSfsProject();
@@ -21139,7 +21140,8 @@ const App = () => {
setProjectName: setProjectName,
currentProjectId: currentProjectId,
setCurrentProjectId: setCurrentProjectId,
showToast: showToast
showToast: showToast,
loadAudioBuffersForTracks: loadAudioBuffersForTracks
}), /*#__PURE__*/React.createElement(SaveProjectModal, {
isOpen: saveProjectModalOpen,
onClose: () => setSaveProjectModalOpen(false),
File diff suppressed because one or more lines are too long