From 5b41506a4dabb401cebceafb4381928d5120b249 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Tue, 23 Sep 2025 23:33:55 +0900 Subject: [PATCH 01/14] feat: add optional zoom level to InternalUserPreferences --- .../src/preferences-schema.tsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/compass-preferences-model/src/preferences-schema.tsx b/packages/compass-preferences-model/src/preferences-schema.tsx index 6b8ead5b276..642c1b3707d 100644 --- a/packages/compass-preferences-model/src/preferences-schema.tsx +++ b/packages/compass-preferences-model/src/preferences-schema.tsx @@ -124,6 +124,7 @@ export type InternalUserPreferences = { // TODO: Remove this as part of COMPASS-8970. enableConnectInNewWindow: boolean; showEndOfLifeConnectionModal: boolean; + zoomLevel?: number; }; // UserPreferences contains all preferences stored to disk. @@ -459,6 +460,17 @@ export const storedUserPreferencesProps: Required<{ ), type: 'boolean', }, + /** + * Zoom level for restoring browser zoom state. + */ + zoomLevel: { + ui: false, + cli: false, + global: false, + description: null, + validator: z.number().optional(), + type: 'number', + }, /** * Enable/disable the AI services. This is currently set * in the atlas-service initialization where we make a request to the From 79e7d61903808d7b744422042a9474594a8decc9 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Tue, 23 Sep 2025 23:36:02 +0900 Subject: [PATCH 02/14] feat: implement debounced zoom level saving and restoration --- packages/compass/src/app/application.tsx | 44 ++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/packages/compass/src/app/application.tsx b/packages/compass/src/app/application.tsx index 35cb81ed3d9..3f3c0373f56 100644 --- a/packages/compass/src/app/application.tsx +++ b/packages/compass/src/app/application.tsx @@ -367,27 +367,71 @@ class Application { const ZOOM_INCREMENT = 0.5; const ZOOM_MAX = 5; const ZOOM_MIN = -3; + const SAVE_DEBOUNCE_DELAY = 500; // 300ms delay for save operations + + // Debounced save zoom level to preferences + let saveTimeout: NodeJS.Timeout | null = null; + const debouncedSaveZoomLevel = (zoomLevel: number) => { + if (saveTimeout) { + clearTimeout(saveTimeout); + } + + saveTimeout = setTimeout(async () => { + try { + await defaultPreferencesInstance.savePreferences({ + zoomLevel, + }); + } catch { + // noop + } + }, SAVE_DEBOUNCE_DELAY); + }; + + // Restore saved zoom level + const restoreZoomLevel = () => { + try { + const preferences = defaultPreferencesInstance.getPreferences(); + const zoomLevel = preferences.zoomLevel ?? ZOOM_DEFAULT; + if (typeof zoomLevel === 'number') { + const validZoomLevel = Math.min( + Math.max(zoomLevel, ZOOM_MIN), + ZOOM_MAX + ); + webFrame.setZoomLevel(validZoomLevel); + } + } catch { + // noop + } + }; const zoomReset = () => { + debouncedSaveZoomLevel(ZOOM_DEFAULT); return webFrame.setZoomLevel(ZOOM_DEFAULT); }; + const zoomIn = () => { const currentZoomLevel = webFrame.getZoomLevel(); const newZoomLevel = Math.min( currentZoomLevel + ZOOM_INCREMENT, ZOOM_MAX ); + debouncedSaveZoomLevel(newZoomLevel); return webFrame.setZoomLevel(newZoomLevel); }; + const zoomOut = () => { const currentZoomLevel = webFrame.getZoomLevel(); const newZoomLevel = Math.max( currentZoomLevel - ZOOM_INCREMENT, ZOOM_MIN ); + debouncedSaveZoomLevel(newZoomLevel); return webFrame.setZoomLevel(newZoomLevel); }; + // Restore zoom level on startup + restoreZoomLevel(); + ipcRenderer?.on('window:zoom-reset', zoomReset); ipcRenderer?.on('window:zoom-in', zoomIn); ipcRenderer?.on('window:zoom-out', zoomOut); From 44e26f8630fb2f7dc77d4737b9b62da4bf532275 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Tue, 23 Sep 2025 23:38:02 +0900 Subject: [PATCH 03/14] fix: simplify zoom level setting by removing validation checks --- packages/compass/src/app/application.tsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/compass/src/app/application.tsx b/packages/compass/src/app/application.tsx index 3f3c0373f56..3dbaaf21ab7 100644 --- a/packages/compass/src/app/application.tsx +++ b/packages/compass/src/app/application.tsx @@ -392,13 +392,7 @@ class Application { try { const preferences = defaultPreferencesInstance.getPreferences(); const zoomLevel = preferences.zoomLevel ?? ZOOM_DEFAULT; - if (typeof zoomLevel === 'number') { - const validZoomLevel = Math.min( - Math.max(zoomLevel, ZOOM_MIN), - ZOOM_MAX - ); - webFrame.setZoomLevel(validZoomLevel); - } + webFrame.setZoomLevel(zoomLevel); } catch { // noop } From fa1e13d9a751a96403c590f800137588b72d3091 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 24 Sep 2025 00:05:50 +0900 Subject: [PATCH 04/14] fix: validate zoom level before restoration to ensure it falls within the acceptable range --- packages/compass/src/app/application.tsx | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/compass/src/app/application.tsx b/packages/compass/src/app/application.tsx index 3dbaaf21ab7..39f58a57f42 100644 --- a/packages/compass/src/app/application.tsx +++ b/packages/compass/src/app/application.tsx @@ -391,7 +391,16 @@ class Application { const restoreZoomLevel = () => { try { const preferences = defaultPreferencesInstance.getPreferences(); - const zoomLevel = preferences.zoomLevel ?? ZOOM_DEFAULT; + const savedZoomLevel = preferences.zoomLevel ?? ZOOM_DEFAULT; + + // Use saved zoom level only if it's within valid range + const zoomLevel = + savedZoomLevel >= ZOOM_MIN && savedZoomLevel <= ZOOM_MAX + ? savedZoomLevel + : ZOOM_DEFAULT; + + console.log('Restoring zoom level to', zoomLevel); + webFrame.setZoomLevel(zoomLevel); } catch { // noop From 4ee3f96496c16f5254fe7475134b40cce222daa0 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 24 Sep 2025 00:25:57 +0900 Subject: [PATCH 05/14] fix: remove console log for restoring zoom level --- packages/compass/src/app/application.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/compass/src/app/application.tsx b/packages/compass/src/app/application.tsx index 39f58a57f42..2c4dc364933 100644 --- a/packages/compass/src/app/application.tsx +++ b/packages/compass/src/app/application.tsx @@ -399,8 +399,6 @@ class Application { ? savedZoomLevel : ZOOM_DEFAULT; - console.log('Restoring zoom level to', zoomLevel); - webFrame.setZoomLevel(zoomLevel); } catch { // noop From 612e24692d69adc2245ba281030e8c54b2b92714 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa <34241526+miya@users.noreply.github.com> Date: Wed, 24 Sep 2025 00:29:53 +0900 Subject: [PATCH 06/14] Update packages/compass/src/app/application.tsx Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/compass/src/app/application.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/compass/src/app/application.tsx b/packages/compass/src/app/application.tsx index 2c4dc364933..ee394fd2304 100644 --- a/packages/compass/src/app/application.tsx +++ b/packages/compass/src/app/application.tsx @@ -367,7 +367,7 @@ class Application { const ZOOM_INCREMENT = 0.5; const ZOOM_MAX = 5; const ZOOM_MIN = -3; - const SAVE_DEBOUNCE_DELAY = 500; // 300ms delay for save operations + const SAVE_DEBOUNCE_DELAY = 500; // 500ms delay for save operations // Debounced save zoom level to preferences let saveTimeout: NodeJS.Timeout | null = null; From 6b4ce4d2744206da320eafac59d6617c192cbaf1 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 24 Sep 2025 00:59:42 +0900 Subject: [PATCH 07/14] fix: prevent memory leaks in zoom timeout handling --- packages/compass/src/app/application.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/compass/src/app/application.tsx b/packages/compass/src/app/application.tsx index ee394fd2304..c575ce3c5c6 100644 --- a/packages/compass/src/app/application.tsx +++ b/packages/compass/src/app/application.tsx @@ -370,19 +370,21 @@ class Application { const SAVE_DEBOUNCE_DELAY = 500; // 500ms delay for save operations // Debounced save zoom level to preferences - let saveTimeout: NodeJS.Timeout | null = null; + let saveTimeoutId: NodeJS.Timeout | null = null; const debouncedSaveZoomLevel = (zoomLevel: number) => { - if (saveTimeout) { - clearTimeout(saveTimeout); + if (saveTimeoutId) { + clearTimeout(saveTimeoutId); } - saveTimeout = setTimeout(async () => { + saveTimeoutId = setTimeout(async () => { try { await defaultPreferencesInstance.savePreferences({ zoomLevel, }); } catch { // noop + } finally { + saveTimeoutId = null; } }, SAVE_DEBOUNCE_DELAY); }; From 0683939ba5bafd043b37d8c9bdfe9a264cc6eae3 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 24 Sep 2025 01:34:41 +0900 Subject: [PATCH 08/14] imprv: execute zoom process first --- packages/compass/src/app/application.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/compass/src/app/application.tsx b/packages/compass/src/app/application.tsx index c575ce3c5c6..12b522d34a8 100644 --- a/packages/compass/src/app/application.tsx +++ b/packages/compass/src/app/application.tsx @@ -408,8 +408,8 @@ class Application { }; const zoomReset = () => { + webFrame.setZoomLevel(ZOOM_DEFAULT); debouncedSaveZoomLevel(ZOOM_DEFAULT); - return webFrame.setZoomLevel(ZOOM_DEFAULT); }; const zoomIn = () => { @@ -418,8 +418,8 @@ class Application { currentZoomLevel + ZOOM_INCREMENT, ZOOM_MAX ); + webFrame.setZoomLevel(newZoomLevel); debouncedSaveZoomLevel(newZoomLevel); - return webFrame.setZoomLevel(newZoomLevel); }; const zoomOut = () => { @@ -428,8 +428,8 @@ class Application { currentZoomLevel - ZOOM_INCREMENT, ZOOM_MIN ); + webFrame.setZoomLevel(newZoomLevel); debouncedSaveZoomLevel(newZoomLevel); - return webFrame.setZoomLevel(newZoomLevel); }; // Restore zoom level on startup From 9fb0100472856904b9a706910bb9fc5371166341 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa <34241526+miya@users.noreply.github.com> Date: Wed, 24 Sep 2025 03:25:26 +0900 Subject: [PATCH 09/14] Update packages/compass/src/app/application.tsx Co-authored-by: Nikola Irinchev --- packages/compass/src/app/application.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/compass/src/app/application.tsx b/packages/compass/src/app/application.tsx index 12b522d34a8..6f5d10dbd78 100644 --- a/packages/compass/src/app/application.tsx +++ b/packages/compass/src/app/application.tsx @@ -396,10 +396,7 @@ class Application { const savedZoomLevel = preferences.zoomLevel ?? ZOOM_DEFAULT; // Use saved zoom level only if it's within valid range - const zoomLevel = - savedZoomLevel >= ZOOM_MIN && savedZoomLevel <= ZOOM_MAX - ? savedZoomLevel - : ZOOM_DEFAULT; + const zoomLevel = Math.min(Math.max(savedZoomLevel, ZOOM_MIN), ZOOM_MAX); webFrame.setZoomLevel(zoomLevel); } catch { From bd6d86270c9053839ac1947149f541fc54c37b0b Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 24 Sep 2025 03:27:18 +0900 Subject: [PATCH 10/14] fix: clarify comment for zoom level clamping --- packages/compass/src/app/application.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/compass/src/app/application.tsx b/packages/compass/src/app/application.tsx index 6f5d10dbd78..70f777e3b51 100644 --- a/packages/compass/src/app/application.tsx +++ b/packages/compass/src/app/application.tsx @@ -389,14 +389,16 @@ class Application { }, SAVE_DEBOUNCE_DELAY); }; - // Restore saved zoom level const restoreZoomLevel = () => { try { const preferences = defaultPreferencesInstance.getPreferences(); const savedZoomLevel = preferences.zoomLevel ?? ZOOM_DEFAULT; - // Use saved zoom level only if it's within valid range - const zoomLevel = Math.min(Math.max(savedZoomLevel, ZOOM_MIN), ZOOM_MAX); + // Clamp zoom level to allowed range + const zoomLevel = Math.min( + Math.max(savedZoomLevel, ZOOM_MIN), + ZOOM_MAX + ); webFrame.setZoomLevel(zoomLevel); } catch { From 19c2743658da398a30bc80343f261c44d3768af5 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 24 Sep 2025 03:30:13 +0900 Subject: [PATCH 11/14] Revert "fix: clarify comment for zoom level clamping" This reverts commit bd6d86270c9053839ac1947149f541fc54c37b0b. --- packages/compass/src/app/application.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/compass/src/app/application.tsx b/packages/compass/src/app/application.tsx index 70f777e3b51..6f5d10dbd78 100644 --- a/packages/compass/src/app/application.tsx +++ b/packages/compass/src/app/application.tsx @@ -389,16 +389,14 @@ class Application { }, SAVE_DEBOUNCE_DELAY); }; + // Restore saved zoom level const restoreZoomLevel = () => { try { const preferences = defaultPreferencesInstance.getPreferences(); const savedZoomLevel = preferences.zoomLevel ?? ZOOM_DEFAULT; - // Clamp zoom level to allowed range - const zoomLevel = Math.min( - Math.max(savedZoomLevel, ZOOM_MIN), - ZOOM_MAX - ); + // Use saved zoom level only if it's within valid range + const zoomLevel = Math.min(Math.max(savedZoomLevel, ZOOM_MIN), ZOOM_MAX); webFrame.setZoomLevel(zoomLevel); } catch { From fae84c3d327defe08c854bb62751675bc7e59786 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 24 Sep 2025 03:31:48 +0900 Subject: [PATCH 12/14] fix: clarify comment for zoom level clamping --- packages/compass/src/app/application.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/compass/src/app/application.tsx b/packages/compass/src/app/application.tsx index 6f5d10dbd78..70f777e3b51 100644 --- a/packages/compass/src/app/application.tsx +++ b/packages/compass/src/app/application.tsx @@ -389,14 +389,16 @@ class Application { }, SAVE_DEBOUNCE_DELAY); }; - // Restore saved zoom level const restoreZoomLevel = () => { try { const preferences = defaultPreferencesInstance.getPreferences(); const savedZoomLevel = preferences.zoomLevel ?? ZOOM_DEFAULT; - // Use saved zoom level only if it's within valid range - const zoomLevel = Math.min(Math.max(savedZoomLevel, ZOOM_MIN), ZOOM_MAX); + // Clamp zoom level to allowed range + const zoomLevel = Math.min( + Math.max(savedZoomLevel, ZOOM_MIN), + ZOOM_MAX + ); webFrame.setZoomLevel(zoomLevel); } catch { From 356f727b6dc1263a657f04d78852dc07d1488328 Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Wed, 24 Sep 2025 03:34:03 +0900 Subject: [PATCH 13/14] fix: simplify zoom level clamping code From adc6866cc93ca598875065906e6485f4a93a4c6f Mon Sep 17 00:00:00 2001 From: Shun Miyazawa Date: Thu, 25 Sep 2025 02:41:21 +0900 Subject: [PATCH 14/14] fix: zoomLevel saving process runs in the background --- packages/compass/src/app/application.tsx | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/packages/compass/src/app/application.tsx b/packages/compass/src/app/application.tsx index 70f777e3b51..cdda3a3f485 100644 --- a/packages/compass/src/app/application.tsx +++ b/packages/compass/src/app/application.tsx @@ -376,16 +376,9 @@ class Application { clearTimeout(saveTimeoutId); } - saveTimeoutId = setTimeout(async () => { - try { - await defaultPreferencesInstance.savePreferences({ - zoomLevel, - }); - } catch { - // noop - } finally { - saveTimeoutId = null; - } + saveTimeoutId = setTimeout(() => { + void defaultPreferencesInstance.savePreferences({ zoomLevel }); + saveTimeoutId = null; }, SAVE_DEBOUNCE_DELAY); };