Skip to content

fix(settings): persist display zoom across app restarts#1820

Merged
piorpua merged 1 commit intoiOfficeAI:mainfrom
amanharshx:fix/display-zoom-persistence-pr
Mar 29, 2026
Merged

fix(settings): persist display zoom across app restarts#1820
piorpua merged 1 commit intoiOfficeAI:mainfrom
amanharshx:fix/display-zoom-persistence-pr

Conversation

@amanharshx
Copy link
Copy Markdown
Contributor

Closes #1819

Summary

  • Persist the Display zoom factor to config when it changes
  • Restore the saved zoom factor during app startup before the main window is shown
  • Add regression coverage for zoom restore, clamping, and window sync behavior

Motivation

Users expect the Display scale setting to behave like a preference, not a temporary session-only adjustment. This change makes the selected zoom level survive app restarts unless the user changes it again.

Diff

+77 −3 across 5 files

Files changed

  • src/common/config/storage.ts
  • src/index.ts
  • src/process/bridge/applicationBridge.ts
  • src/process/utils/zoom.ts
  • tests/unit/process/utils/zoom.test.ts

Testing

  • bun run test -- tests/unit/process/utils/zoom.test.ts
  • bunx tsc --noEmit
  • Manual: change Display scale, restart app, verify the selected zoom persists
  • Manual: verify invalid or out-of-range persisted values fall back safely

@sentry
Copy link
Copy Markdown

sentry bot commented Mar 28, 2026

Codecov Report

❌ Patch coverage is 33.33333% with 6 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
src/process/bridge/applicationBridge.ts 16.66% 5 Missing ⚠️
src/process/utils/zoom.ts 66.66% 0 Missing and 1 partial ⚠️

📢 Thoughts on this report? Let us know!

@piorpua piorpua added the bot:reviewing Review in progress (mutex) label Mar 29, 2026
@piorpua
Copy link
Copy Markdown
Contributor

piorpua commented Mar 29, 2026

Code Review:fix(settings): persist display zoom across app restarts (#1820)

变更概述

本 PR 为 Display 缩放功能增加了持久化支持:在用户更改缩放比例时将值写入 ProcessConfig,在应用启动时(主窗口创建前)从配置中恢复上次的缩放值。涉及 storage.ts(类型声明)、zoom.ts(新增 initializeZoomFactor)、applicationBridge.ts(写入持久化)、index.ts(启动时恢复)和新增单元测试,共 +77 / −3 行。


方案评估

结论:✅ 方案合理

在 IPC handler 中同步更新内存状态(setZoomFactor)、异步持久化(ProcessConfig.set),失败时仅记录日志、不影响当前会话——这是合理的尽力持久化语义。initializeZoomFactor 在主窗口创建前调用,无需广播给窗口,逻辑正确。配合 clampZoomFactor 的防御性处理,异常值(NaN、越界)均能安全回退。


问题清单

🔵 LOW — 未测试 undefined 入参路径

文件tests/unit/process/utils/zoom.test.ts

问题说明src/index.ts 在 catch 分支调用 initializeZoomFactor(undefined),且 ProcessConfig.get('ui.zoomFactor') 在 key 未设置时返回 undefined。当前测试覆盖了 NaN 和有效数值,但没有直接覆盖 undefined 的路径。虽然代码逻辑(factor ?? UI_SCALE_DEFAULT)能正确处理,显式测试可防止日后修改时静默回退。

修复建议:在 zoom.test.ts 中增加:

it('should fall back to the default zoom factor for undefined persisted value', async () => {
  const { getZoomFactor, initializeZoomFactor } = await import('@process/utils/zoom');

  initializeZoomFactor(undefined);

  expect(getZoomFactor()).toBe(1);
});

🔵 LOW — applicationBridge 中新增代码覆盖率偏低

文件src/process/bridge/applicationBridge.ts,第 76–84 行

问题说明:Codecov 报告显示 applicationBridge.ts 的 patch coverage 仅 16.66%(5 行未覆盖),具体为新增的 setZoomFactor.provider 异步持久化逻辑(ProcessConfig.set 成功路径和 catch 路径)均无测试。当前测试文件仅覆盖了 zoom.ts 的纯函数,bridge 层的集成行为未被验证。

修复建议:为 setZoomFactor.provider 添加单元测试,mock ProcessConfig.set 验证:(1) 正常路径下 ProcessConfig.set 被以正确值调用;(2) ProcessConfig.set 抛出异常时函数仍正常返回 updatedFactor(吞错不影响结果)。


汇总

# 严重级别 文件 问题
1 🔵 LOW zoom.test.ts 未覆盖 initializeZoomFactor(undefined) 路径
2 🔵 LOW applicationBridge.ts:76–84 新增 IPC 持久化逻辑缺少单元测试(patch 覆盖率 16.67%)

结论

批准合并 — 无阻塞性问题,两处均为 LOW 级别的测试覆盖补充建议,不影响功能正确性。


本报告由本地 pr-review skill 生成,包含完整项目上下文,无截断限制。

@piorpua
Copy link
Copy Markdown
Contributor

piorpua commented Mar 29, 2026

✅ 已自动 review,无阻塞性问题,正在触发自动合并。

@piorpua piorpua merged commit 46286e2 into iOfficeAI:main Mar 29, 2026
13 of 14 checks passed
@piorpua piorpua added bot:done Auto-merged by bot and removed bot:reviewing Review in progress (mutex) labels Mar 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bot:done Auto-merged by bot

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: display zoom resets after reopening the app

2 participants