From 63b9f29ef5f714f6fded1b8f8a2fd8f4b70eb791 Mon Sep 17 00:00:00 2001 From: Victor Giers Date: Fri, 10 Apr 2026 12:23:27 +0200 Subject: [PATCH] Refactor save and load functionality in App.tsx --- src/app/App.tsx | 44 +++++++++++++++++++------------------------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/src/app/App.tsx b/src/app/App.tsx index a589b518..2752d393 100644 --- a/src/app/App.tsx +++ b/src/app/App.tsx @@ -1653,9 +1653,9 @@ export function App({ store, initialStatusMessage }: AppProps) { return; } - if (hasPrimaryModifier && event.code === "KeyS" && !event.shiftKey) { + if (hasPrimaryModifier && event.code === "KeyS") { event.preventDefault(); - handleSaveDraft(); + void handleSaveProject(); return; } @@ -4435,40 +4435,33 @@ export function App({ store, initialStatusMessage }: AppProps) { scheduleDraftCommit(applyChange); }; - const handleSaveDraft = () => { - const result = store.saveDraft(); - setStatusMessage(result.message); - }; - - const handleLoadDraft = () => { - const result = store.loadDraft(); - setStatusMessage(result.message); - }; - - const handleExportJson = () => { + const handleSaveProject = async () => { try { - const exportedJson = store.exportDocumentJson(); - const blob = new Blob([exportedJson], { type: "application/json" }); + if (!projectAssetStorageReady && projectAssetList.length > 0) { + throw new Error("Project save failed: project asset storage is still initializing for this asset-backed scene."); + } + + const projectBytes = await saveProjectPackage(editorState.document, projectAssetStorage); + const blob = new Blob([projectBytes], { type: "application/zip" }); const objectUrl = URL.createObjectURL(blob); const anchor = document.createElement("a"); anchor.href = objectUrl; - anchor.download = `${editorState.document.name.replace(/\s+/g, "-").toLowerCase() || "scene"}.json`; + anchor.download = createProjectDownloadName(editorState.document.name); anchor.click(); URL.revokeObjectURL(objectUrl); - setStatusMessage("Scene document exported as JSON."); + setStatusMessage(`Saved project ${anchor.download}.`); } catch (error) { - const message = getErrorMessage(error); - setStatusMessage(message); + setStatusMessage(getErrorMessage(error)); } }; - const handleImportJsonButtonClick = () => { - importInputRef.current?.click(); + const handleLoadProjectButtonClick = () => { + importProjectInputRef.current?.click(); }; - const handleImportJsonChange = async (event: ChangeEvent) => { + const handleLoadProjectChange = async (event: ChangeEvent) => { const input = event.currentTarget; const file = input.files?.[0]; @@ -4477,9 +4470,10 @@ export function App({ store, initialStatusMessage }: AppProps) { } try { - const source = await file.text(); - store.importDocumentJson(source); - setStatusMessage(`Imported ${file.name}.`); + const projectBytes = new Uint8Array(await file.arrayBuffer()); + const nextDocument = await loadProjectPackage(projectBytes, projectAssetStorage); + store.replaceDocument(nextDocument); + setStatusMessage(`Loaded project ${file.name}.`); } catch (error) { setStatusMessage(getErrorMessage(error)); } finally {