From 90e47e07abb54b6a1ff1f55459dabda5c0e538ce Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Sun, 1 Mar 2026 15:17:03 +0300 Subject: [PATCH] Add autosave: debounced write 3s after last scene change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Triggers only when a file handle (browser File System Access API) or file path (Tauri) exists. Tracks savedVersion to skip redundant writes. Silent failure — user can always save manually. --- src/stores/editor.ts | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/src/stores/editor.ts b/src/stores/editor.ts index 903f61a29..2ba48ac69 100644 --- a/src/stores/editor.ts +++ b/src/stores/editor.ts @@ -1,4 +1,4 @@ -import { reactive, shallowRef, computed } from 'vue' +import { reactive, shallowRef, computed, watch } from 'vue' import { IS_TAURI, @@ -117,6 +117,8 @@ export function createEditorStore() { const pageViewports = new Map() let fileHandle: FileSystemFileHandle | null = null let filePath: string | null = null + let savedVersion = 0 + let autosaveTimer: ReturnType | undefined let _ck: import('canvaskit-wasm').CanvasKit | null = null let _renderer: import('@/engine/renderer').SkiaRenderer | null = null let _textEditor: TextEditor | null = null @@ -157,6 +159,25 @@ export function createEditorStore() { sceneVersion: 0 }) + const AUTOSAVE_DELAY = 3000 + + watch( + () => state.sceneVersion, + (version) => { + if (version === savedVersion) return + if (!fileHandle && !filePath) return + clearTimeout(autosaveTimer) + autosaveTimer = setTimeout(async () => { + if (state.sceneVersion === savedVersion) return + try { + await writeFile(await buildFigFile()) + } catch { + // silently fail — user can still save manually + } + }, AUTOSAVE_DELAY) + } + ) + const selectedNodes = computed(() => { void state.sceneVersion const nodes: SceneNode[] = [] @@ -604,12 +625,14 @@ export function createEditorStore() { if (filePath && IS_TAURI) { const { writeFile: tauriWrite } = await import('@tauri-apps/plugin-fs') await tauriWrite(filePath, data) + savedVersion = state.sceneVersion return } if (fileHandle) { const writable = await fileHandle.createWritable() await writable.write(new Uint8Array(data)) await writable.close() + savedVersion = state.sceneVersion } }