Skip to content

[ui][bug] Translation 页保存动作无 saving/saved/error 反馈 — 失败用户无感 #314

@appergb

Description

@appergb

现象

openless-all/app/src/pages/Translation.tsx 所有写操作都是 fire-and-forget(不 await,或 await 但不 try/catch),UI 不显示 saving / saved / failed 任一状态:

用户动作 UI 调用
勾/取消"工作语言" Translation.tsx:69-87 Translation.tsx:34-41 savePrefs({ ...prefs, workingLanguages })
选"翻译目标语言" Translation.tsx:114 <select> Translation.tsx:42-43 savePrefs({ ...prefs, translationTargetLanguage })
录翻译热键 Translation.tsx:143 ShortcutRecorder Translation.tsx:145-148 await setTranslationHotkey(binding); await savePrefs(...)

savePrefsuseHotkeySettings().updatePrefssrc/state/HotkeySettingsContext.tsx:94-104),内部走串行队列调 set_settings

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

调用 IPC 包装 Rust handler
savePrefs(...) queueSetSettings 串行后调 setSettings src/lib/ipc.ts:142invokeOrMock('set_settings', { prefs }, …) commands.rs:116 set_settings(…)
setTranslationHotkey(binding) src/lib/ipc.ts:340invokeOrMock('set_translation_hotkey', { binding }, …) commands.rs:850 set_translation_hotkey(…)

失败路径

  • set_settings 落盘失败 / set_translation_hotkey 注册热键失败 → 队列里的 task reject → await savePrefs(...) reject
  • 当前页代码:
    • toggleWorkingLanguage / onTargetChange() => savePrefs(...) 形式,调用方根本没 await,promise rejection 进 unhandled
    • 翻译热键 onSave 链了两个 await 但没 try/catch,第一个 reject 后第二个就不跑
  • UI:无 saving spinner、无 saved tick、无 error 文案

用户可见后果

  1. 切翻译目标语言后,UI 上"已启用"立刻亮起,但实际可能没写入 → 下次按 Shift 不触发翻译
  2. 改翻译热键后,看起来已生效,实际 setTranslationHotkey 失败、savePrefs 也没跑 → 旧热键继续生效,用户以为热键坏了
  3. 没有任何渠道让用户知道"刚才那一下没保存"

建议接受标准

  • 三个保存路径都加 try/catch + 状态机(idle / saving / saved / failed),与 Settings.tsx provider/credentials 区域已有的 saved/saveError 写法对齐
  • 失败时回滚本地 state 或 banner 提示
  • setTranslationHotkey reject 时不要继续调 savePrefs,且 banner 注明是哪一步失败

不在范围

  • HotkeySettingsContext.queueSetSettings 内部已经 .catch(() => undefined) 防止打断队列,本 issue 不重构队列设计
  • SelectionAsk 同类问题独立 issue

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