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 } }