diff --git a/apps/web/src/components/providers/editor-provider.tsx b/apps/web/src/components/providers/editor-provider.tsx index 5f672e01..b1b5ab3a 100644 --- a/apps/web/src/components/providers/editor-provider.tsx +++ b/apps/web/src/components/providers/editor-provider.tsx @@ -117,6 +117,19 @@ export function EditorProvider({ projectId, children }: EditorProviderProps) { } function EditorRuntimeBindings() { + const editor = useEditor(); + + useEffect(() => { + const handleBeforeUnload = (event: BeforeUnloadEvent) => { + if (!editor.save.getIsDirty()) return; + event.preventDefault(); + (event as unknown as { returnValue: string }).returnValue = ""; + }; + + window.addEventListener("beforeunload", handleBeforeUnload); + return () => window.removeEventListener("beforeunload", handleBeforeUnload); + }, [editor]); + useEditorActions(); useKeybindingsListener(); return null; diff --git a/apps/web/src/core/managers/save-manager.ts b/apps/web/src/core/managers/save-manager.ts index 28cfde52..d5881b6b 100644 --- a/apps/web/src/core/managers/save-manager.ts +++ b/apps/web/src/core/managers/save-manager.ts @@ -62,6 +62,10 @@ export class SaveManager { await this.saveNow(); } + getIsDirty(): boolean { + return this.hasPendingSave || this.isSaving; + } + private queueSave(): void { if (this.isSaving) return; if (this.saveTimer) {