From e21ef53a3d876563e6b92c7ca878efb43da3e42b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Angelantoni?= Date: Wed, 31 Dec 2025 23:12:07 -0700 Subject: [PATCH] fix(settings): ensure global settings sync across all open panes (#2818) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(settings): ensure global settings sync across all open panes Previously, changing a global setting (like font size) only updated the currently active book pane, causing split-view panes to desynchronize. This commit updates the settings logic to propagate global changes to all open book instances immediately. It also ensures that settings UI panels correctly re-render when preferences are updated from outside the component. * refactor to reuse some code * fix: pointer in doc check --------- Co-authored-by: André Angelantoni Co-authored-by: Huang Xin --- .../src/app/reader/components/HeaderBar.tsx | 2 +- apps/readest-app/src/helpers/settings.ts | 36 +++++++++++-------- 2 files changed, 23 insertions(+), 15 deletions(-) diff --git a/apps/readest-app/src/app/reader/components/HeaderBar.tsx b/apps/readest-app/src/app/reader/components/HeaderBar.tsx index 8a28aa41..f808c5bd 100644 --- a/apps/readest-app/src/app/reader/components/HeaderBar.tsx +++ b/apps/readest-app/src/app/reader/components/HeaderBar.tsx @@ -62,7 +62,7 @@ const HeaderBar: React.FC = ({ const windowButtonVisible = appService?.hasWindowBar && !isTrafficLightVisible; const docs = view?.renderer.getContents() ?? []; - const pointerInDoc = docs.some(({ doc }) => doc.body.style.cursor === 'pointer'); + const pointerInDoc = docs.some(({ doc }) => doc.body?.style.cursor === 'pointer'); const enableAnnotationQuickActions = viewSettings?.enableAnnotationQuickActions; const annotationQuickActionButton = diff --git a/apps/readest-app/src/helpers/settings.ts b/apps/readest-app/src/helpers/settings.ts index e8adac36..cbedacc6 100644 --- a/apps/readest-app/src/helpers/settings.ts +++ b/apps/readest-app/src/helpers/settings.ts @@ -15,29 +15,37 @@ export const saveViewSettings = async ( applyStyles = true, ) => { const { settings, isSettingsGlobal, setSettings, saveSettings } = useSettingsStore.getState(); - const { getView, getViewSettings, setViewSettings } = useReaderStore.getState(); + const { bookKeys, getView, getViewState, getViewSettings, setViewSettings } = + useReaderStore.getState(); const { getConfig, saveConfig } = useBookDataStore.getState(); - const viewSettings = getViewSettings(bookKey); - if (bookKey && viewSettings && viewSettings[key] !== value) { - viewSettings[key] = value; - if (applyStyles) { - const view = getView(bookKey); - view?.renderer.setStyles?.(getStyles(viewSettings)); + + const applyViewSettings = async (bookKey: string) => { + const viewSettings = getViewSettings(bookKey); + const viewState = getViewState(bookKey); + if (bookKey && viewSettings && viewSettings[key] !== value) { + viewSettings[key] = value; + setViewSettings(bookKey, viewSettings); + if (applyStyles) { + const view = getView(bookKey); + view?.renderer.setStyles?.(getStyles(viewSettings)); + } + const config = getConfig(bookKey); + if (viewState?.isPrimary && config) { + await saveConfig(envConfig, bookKey, config, settings); + } } - } + }; if (isSettingsGlobal && !skipGlobal) { settings.globalViewSettings[key] = value; setSettings(settings); await saveSettings(envConfig, settings); - } - if (bookKey && viewSettings) { - setViewSettings(bookKey, viewSettings); - const config = getConfig(bookKey); - if (config) { - await saveConfig(envConfig, bookKey, config, settings); + for (const bookKey of bookKeys) { + await applyViewSettings(bookKey); } + } else if (bookKey) { + await applyViewSettings(bookKey); } };