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:
+68
-66
@@ -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
Reference in New Issue
Block a user