diff --git a/apps/client/src/components/app_context.ts b/apps/client/src/components/app_context.ts index 35efd283a..223653321 100644 --- a/apps/client/src/components/app_context.ts +++ b/apps/client/src/components/app_context.ts @@ -668,6 +668,10 @@ export class AppContext extends Component { this.beforeUnloadListeners.push(obj); } } + + removeBeforeUnloadListener(listener: (() => boolean)) { + this.beforeUnloadListeners = this.beforeUnloadListeners.filter(l => l === listener); + } } const appContext = new AppContext(window.glob.isMainWindow); diff --git a/apps/client/src/widgets/note_detail.ts.bak b/apps/client/src/widgets/note_detail.ts.bak deleted file mode 100644 index 542c40dc2..000000000 --- a/apps/client/src/widgets/note_detail.ts.bak +++ /dev/null @@ -1,20 +0,0 @@ -export default class NoteDetailWidget extends NoteContextAwareWidget { - - private typeWidgets: Record; - private spacedUpdate: SpacedUpdate; - private type?: ExtendedNoteType; - private mime?: string; - - constructor() { - super(); - - this.typeWidgets = {}; - - appContext.addBeforeUnloadListener(this); - } - - beforeUnloadEvent() { - return this.spacedUpdate.isAllSavedAndTriggerUpdate(); - } - -} diff --git a/apps/client/src/widgets/note_title.tsx b/apps/client/src/widgets/note_title.tsx index 8207198d6..7f7f0cd22 100644 --- a/apps/client/src/widgets/note_title.tsx +++ b/apps/client/src/widgets/note_title.tsx @@ -47,7 +47,9 @@ export default function NoteTitleWidget() { // Prevent user from navigating away if the spaced update is not done. useEffect(() => { - appContext.addBeforeUnloadListener(() => spacedUpdate.isAllSavedAndTriggerUpdate()); + const listener = () => spacedUpdate.isAllSavedAndTriggerUpdate(); + appContext.addBeforeUnloadListener(listener); + return () => appContext.removeBeforeUnloadListener(listener); }, []); useTriliumEvents([ "beforeNoteSwitch", "beforeNoteContextRemove" ], () => spacedUpdate.updateNowIfNecessary()); diff --git a/apps/client/src/widgets/react/hooks.tsx b/apps/client/src/widgets/react/hooks.tsx index daf4c84be..38c3eec0e 100644 --- a/apps/client/src/widgets/react/hooks.tsx +++ b/apps/client/src/widgets/react/hooks.tsx @@ -1,5 +1,5 @@ import { MutableRef, useCallback, useContext, useDebugValue, useEffect, useLayoutEffect, useMemo, useRef, useState } from "preact/hooks"; -import { EventData, EventNames } from "../../components/app_context"; +import appContext, { EventData, EventNames } from "../../components/app_context"; import { ParentComponent, refToJQuerySelector } from "./react_utils"; import SpacedUpdate from "../../services/spaced_update"; import { FilterLabelsByType, KeyboardActionNames, OptionNames, RelationNames } from "@triliumnext/commons"; @@ -23,7 +23,6 @@ import protected_session_holder from "../../services/protected_session_holder"; import server from "../../services/server"; import { removeIndividualBinding } from "../../services/shortcuts"; import { ViewScope } from "../../services/link"; -import { VirtualConsolePrinter } from "happy-dom"; export function useTriliumEvent(eventName: T, handler: (data: EventData) => void) { const parentComponent = useContext(ParentComponent); @@ -128,6 +127,13 @@ export function useEditorSpacedUpdate({ note, noteContext, getData, onContentCha await spacedUpdate.updateNowIfNecessary(); }) + // Save if needed upon window/browser closing. + useEffect(() => { + const listener = () => spacedUpdate.isAllSavedAndTriggerUpdate(); + appContext.addBeforeUnloadListener(listener); + return () => appContext.removeBeforeUnloadListener(listener); + }, []); + return spacedUpdate; }