Add editor-autosave.ts for autosave functionality

This commit is contained in:
2026-04-10 12:22:05 +02:00
parent 7ed2cf92f9
commit 72ca505a61

View File

@@ -0,0 +1,52 @@
import type { SaveSceneDocumentDraftResult } from "./local-draft-storage";
export interface EditorAutosaveControllerOptions {
debounceMs?: number;
onComplete?: (result: SaveSceneDocumentDraftResult) => void;
saveDraft: () => SaveSceneDocumentDraftResult;
}
export class EditorAutosaveController {
private readonly debounceMs: number;
private readonly onComplete: ((result: SaveSceneDocumentDraftResult) => void) | undefined;
private readonly saveDraft: () => SaveSceneDocumentDraftResult;
private timeoutId: number | null = null;
constructor(options: EditorAutosaveControllerOptions) {
this.debounceMs = options.debounceMs ?? 200;
this.onComplete = options.onComplete;
this.saveDraft = options.saveDraft;
}
schedule() {
this.clearPendingTimeout();
this.timeoutId = window.setTimeout(() => {
this.timeoutId = null;
this.runSave();
}, this.debounceMs);
}
flush(): SaveSceneDocumentDraftResult {
this.clearPendingTimeout();
return this.runSave();
}
dispose() {
this.clearPendingTimeout();
}
private clearPendingTimeout() {
if (this.timeoutId === null) {
return;
}
window.clearTimeout(this.timeoutId);
this.timeoutId = null;
}
private runSave(): SaveSceneDocumentDraftResult {
const result = this.saveDraft();
this.onComplete?.(result);
return result;
}
}