mobile: choose between off, blocks and pages in editor settings

This commit is contained in:
Ammar Ahmed
2026-08-26 19:51:51 +05:00
parent af2369c4ae
commit ac5b749299
8 changed files with 49 additions and 18 deletions

View File

@@ -58,7 +58,7 @@ export type Settings = {
timeFormat: string;
fontScale: number;
markdownShortcuts: boolean;
virtualization?: boolean;
virtualization?: "off" | "blocks" | "pages";
features: Record<any, any>;
loggedIn: boolean;
defaultLineHeight: number;

View File

@@ -34,6 +34,7 @@ import {
DateFormatPicker,
DayFormatPicker,
WeekFormatPicker,
EditorVirtualizationPicker,
FontPicker,
HomePicker,
ImageCompressionPicker,
@@ -64,6 +65,7 @@ export const components: { [name: string]: ReactElement } = {
licenses: <Licenses />,
"trash-interval-selector": <TrashIntervalPicker />,
"font-selector": <FontPicker />,
"editor-virtualization-selector": <EditorVirtualizationPicker />,
"title-format": <TitleFormat />,
"date-format-selector": <DateFormatPicker />,
"time-format-selector": <TimeFormatPicker />,

View File

@@ -95,6 +95,34 @@ export const HomePicker = createSettingsPicker({
isOptionAvailable: async () => true
});
type VirtualizationMode = NonNullable<Settings["editorVirtualization"]>;
const VIRTUALIZATION_MODES: VirtualizationMode[] = ["off", "blocks", "pages"];
export const EditorVirtualizationPicker = createSettingsPicker<
VirtualizationMode,
VirtualizationMode
>({
getValue: () =>
useSettingStore.getState().settings.editorVirtualization || "off",
updateValue: async (item) => {
SettingsService.set({ editorVirtualization: item });
},
formatValue: (item) => {
const mode = (
typeof item === "object" ? "off" : item
) as VirtualizationMode;
if (mode === "blocks") return strings.editorVirtualizationBlocks();
if (mode === "pages") return strings.editorVirtualizationPages();
return strings.editorVirtualizationOff();
},
getItemKey: (item) => item,
options: VIRTUALIZATION_MODES,
compareValue: (current, item) => current === item,
isFeatureAvailable: async () => true,
isOptionAvailable: async () => true
});
export const SidebarTabPicker = createSettingsPicker({
getValue: () => useSettingStore.getState().settings.defaultSidebarTab,
updateValue: async (item) => {
@@ -137,8 +165,8 @@ export const TrashIntervalPicker = createSettingsPicker({
return item === -1
? strings.never()
: item === 1
? strings.reminderRecurringMode.day()
: strings.days(item);
? strings.reminderRecurringMode.day()
: strings.days(item);
},
getItemKey: (item) => item.toString(),
options: [-1, 1, 7, 30, 365] as TrashCleanupInterval[],
@@ -294,10 +322,10 @@ export const ApplockTimerPicker = createSettingsPicker({
return item === -1
? strings.never()
: item === 0 || item === undefined
? strings.immediately()
: item === 1
? strings.minutes(1)
: strings.minutes(item);
? strings.immediately()
: item === 1
? strings.minutes(1)
: strings.minutes(item);
},
getItemKey: (item) => item.toString(),
options: [-1, 0, 1, 5, 15, 30],
@@ -321,8 +349,8 @@ export const VaultLockTimerPicker = createSettingsPicker({
return item === -1
? strings.never()
: item < 1000 * 60 * 60
? strings.minutes(item / (1000 * 60))
: strings.hours(item / (1000 * 60 * 60));
? strings.minutes(item / (1000 * 60))
: strings.hours(item / (1000 * 60 * 60));
},
getItemKey: (item) => item.toString(),
options: [
@@ -349,8 +377,8 @@ export const ImageCompressionPicker = createSettingsPicker({
return item === "ask-every-time"
? strings.askEveryTime()
: item === "enabled"
? strings.enableRecommended()
: strings.disable();
? strings.enableRecommended()
: strings.disable();
},
getItemKey: (item) => item,
options: [

View File

@@ -1027,7 +1027,8 @@ export const settingsGroups: SettingSection[] = [
id: "editor-virtualization",
name: strings.editorVirtualization(),
description: strings.editorVirtualizationDesc(),
type: "switch",
type: "component",
component: "editor-virtualization-selector",
property: "editorVirtualization",
icon: "page-next-outline"
},

View File

@@ -78,7 +78,7 @@ export type Settings = {
sessionExpired: boolean;
version: string | null;
doubleSpacedLines?: boolean;
editorVirtualization?: boolean;
editorVirtualization?: "off" | "blocks" | "pages";
disableAutoSync?: boolean;
disableSync?: boolean;
reminderNotifications?: boolean;
@@ -197,7 +197,7 @@ export const defaultSettings: SettingStore["settings"] = {
sessionExpired: false,
version: null,
doubleSpacedLines: true,
editorVirtualization: false,
editorVirtualization: "off",
reminderNotifications: true,
defaultSnoozeTime: "5",
corsProxy: "https://cors.notesnook.com",

View File

@@ -259,7 +259,7 @@ const Tiptap = ({
timeFormat: settings.timeFormat as "12-hour" | "24-hour" | undefined,
dayFormat: settings.dayFormat,
enableInputRules: settings.markdownShortcuts,
virtualization: !!settings.virtualization
virtualization: settings.virtualization || "off"
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [
@@ -963,7 +963,7 @@ const Tiptap = ({
// once and only rebuilds its view afterwards, so extension options are
// frozen at construction — toggling paging only takes effect when this
// component remounts.
key={tick + tab.id + "-editor-" + !!settings.virtualization}
key={tick + tab.id + "-editor-" + (settings.virtualization || "off")}
options={tiptapOptions}
settings={settings}
onEditorUpdate={(editor) => {

View File

@@ -52,7 +52,7 @@ export type Settings = {
dateFormat: string;
fontScale: number;
markdownShortcuts: boolean;
virtualization?: boolean;
virtualization?: "off" | "blocks" | "pages";
features: Record<any, any>;
loggedIn: boolean;
defaultLineHeight: number;

File diff suppressed because one or more lines are too long