From 15f5d87717c141ba85e195eb8ded80ebeebe1149 Mon Sep 17 00:00:00 2001 From: Ammar Ahmed Date: Tue, 25 Aug 2026 11:40:12 +0500 Subject: [PATCH] web: add editor virtualization toggle in settings --- apps/web/src/components/editor/tiptap.tsx | 19 ++++++++++++++++--- .../src/dialogs/settings/editor-settings.ts | 15 +++++++++++++++ apps/web/src/stores/setting-store.ts | 8 ++++++++ 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/apps/web/src/components/editor/tiptap.tsx b/apps/web/src/components/editor/tiptap.tsx index d4b72db17..d32f6807e 100644 --- a/apps/web/src/components/editor/tiptap.tsx +++ b/apps/web/src/components/editor/tiptap.tsx @@ -115,6 +115,7 @@ type TipTapProps = { dayFormat: DayFormat; markdownShortcuts: boolean; fontLigatures: boolean; + virtualization: boolean; }; function countCharacters(text: string) { @@ -190,7 +191,8 @@ function TipTap(props: TipTapProps) { timeFormat, dayFormat, markdownShortcuts, - fontLigatures + fontLigatures, + virtualization } = props; const autoSave = useRef(true); @@ -268,6 +270,7 @@ function TipTap(props: TipTapProps) { }, enableInputRules: markdownShortcuts, enableFontLigatures: fontLigatures, + virtualization, downloadOptions, doubleSpacedLines, dateFormat, @@ -493,7 +496,8 @@ function TipTap(props: TipTapProps) { timeFormat, dayFormat, markdownShortcuts, - fontLigatures + fontLigatures, + virtualization ]); const editor = useTiptap( @@ -600,6 +604,7 @@ function TiptapWrapper( | "dayFormat" | "markdownShortcuts" | "fontLigatures" + | "virtualization" > > & { isHydrating?: boolean; @@ -619,6 +624,9 @@ function TiptapWrapper( (store) => store.markdownShortcuts ); const fontLigatures = useSettingsStore((store) => store.fontLigatures); + const virtualization = useSettingsStore( + (store) => store.editorVirtualization + ); const containerRef = useRef(null); const editorContainerRef = useRef(); const { editorConfig, setEditorConfig } = useEditorConfig(); @@ -706,7 +714,11 @@ function TiptapWrapper( }} > { if (!isHydrating) { onLoad?.(editor); diff --git a/apps/web/src/dialogs/settings/editor-settings.ts b/apps/web/src/dialogs/settings/editor-settings.ts index f6b114b16..22b2e56d1 100644 --- a/apps/web/src/dialogs/settings/editor-settings.ts +++ b/apps/web/src/dialogs/settings/editor-settings.ts @@ -156,6 +156,21 @@ export const EditorSettings: SettingsGroup[] = [ toggle: () => useSettingStore.getState().toggleFontLigatures() } ] + }, + { + key: "editor-virtualization", + title: strings.editorVirtualization(), + description: strings.editorVirtualizationDesc(), + onStateChange: (listener) => + useSettingStore.subscribe((c) => c.editorVirtualization, listener), + components: [ + { + type: "toggle", + isToggled: () => useSettingStore.getState().editorVirtualization, + toggle: () => + useSettingStore.getState().toggleEditorVirtualization() + } + ] } ] }, diff --git a/apps/web/src/stores/setting-store.ts b/apps/web/src/stores/setting-store.ts index d8fe0e003..75b266c45 100644 --- a/apps/web/src/stores/setting-store.ts +++ b/apps/web/src/stores/setting-store.ts @@ -57,6 +57,7 @@ class SettingStore extends BaseStore { doubleSpacedParagraphs = Config.get("doubleSpacedLines", true); markdownShortcuts = Config.get("markdownShortcuts", false); fontLigatures = Config.get("fontLigatures", false); + editorVirtualization = Config.get("editorVirtualization", false); notificationsSettings = Config.get("notifications", { reminder: true }); isFullOfflineMode = Config.get("fullOfflineMode", false); serverUrls: Partial> = Config.get("serverUrls", {}); @@ -250,6 +251,13 @@ class SettingStore extends BaseStore { Config.set("fontLigatures", !fontLigatures); }; + toggleEditorVirtualization = (toggleState?: boolean) => { + const editorVirtualization = this.get().editorVirtualization; + const next = toggleState ?? !editorVirtualization; + this.set((state) => (state.editorVirtualization = next)); + Config.set("editorVirtualization", next); + }; + togglePrivacyMode = async () => { const privacyMode = this.get().privacyMode; this.set({ privacyMode: !privacyMode });