Skip to content

[ui][bug] Style 页 3 个写操作失败无回滚无反馈 — UI 与后端可能不一致 #313

@appergb

Description

@appergb

现象

openless-all/app/src/pages/Style.tsx 三个写操作都是"乐观更新 + await 后端",但失败时既没有回滚本地 state,也没有给用户任何错误提示:

函数 行号 模式
onPickDefault(mode) Style.tsx:33-37 setPrefs(next); await setDefaultPolishMode(mode);
onToggleEnabled(mode) Style.tsx:39-47 setPrefs(next); await setStyleEnabled(mode, enabled);
onMasterToggle() Style.tsx:61-73 setPrefs(next); await setSettings(next);

完整链路(UI → IPC → Rust handler)

动作 IPC 包装 Rust handler
切默认 setDefaultPolishMode src/lib/ipc.ts:267invokeOrMock('set_default_polish_mode', { mode }, …) commands.rs:644 set_default_polish_mode(…)
启停某风格 setStyleEnabled src/lib/ipc.ts:271invokeOrMock('set_style_enabled', { mode, enabled }, …) commands.rs:654 set_style_enabled(…)
总开关 setSettings src/lib/ipc.ts:142invokeOrMock('set_settings', { prefs }, …) commands.rs:116 set_settings(…)

三个 handler 都返回 Result<_, String>,前端却没人接 Err

失败路径

任意 IPC 调用 reject 时:

  1. 本地 prefs state 已经被 setPrefs(next) 更新成"假成功"的值
  2. await reject 抛出 unhandled rejection
  3. 用户在 UI 看到的状态(蓝色勾选 / toggle 已打开)和 preferences.json 实际内容不一致
  4. 下次刷新页面 / 重启应用,本地 state 重置回真实磁盘状态,用户的"刚才点的那一下"被静默撤销

用户可见后果

  • 切了默认风格,下次启动发现没切成功
  • 启停某个风格,重启后又是旧状态
  • 总开关切回去无感
  • 都不知道是为什么

建议接受标准

  • 三个函数加 try/catch,失败时回滚本地 state(重新调 getSettings() 或保留前值)
  • 失败时显示 inline 错误(位置:风格卡片内 / 总开关旁),文本来自 handler 返回的 Err(String)
  • 至少加 1 个测试覆盖"setSettings reject 时 UI 回滚"

不在范围

  • 注释/实现不一致是 sibling issue,独立处理
  • 不引入全局 toast 框架
  • 后端 handler 不变

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions