现象
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(...) |
savePrefs 即 useHotkeySettings().updatePrefs(src/state/HotkeySettingsContext.tsx:94-104),内部走串行队列调 set_settings。
完整链路(UI → IPC → Rust handler)
| 调用 |
IPC 包装 |
Rust handler |
savePrefs(...) |
经 queueSetSettings 串行后调 setSettings src/lib/ipc.ts:142 → invokeOrMock('set_settings', { prefs }, …) |
commands.rs:116 set_settings(…) |
setTranslationHotkey(binding) |
src/lib/ipc.ts:340 → invokeOrMock('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 文案
用户可见后果
- 切翻译目标语言后,UI 上"已启用"立刻亮起,但实际可能没写入 → 下次按 Shift 不触发翻译
- 改翻译热键后,看起来已生效,实际
setTranslationHotkey 失败、savePrefs 也没跑 → 旧热键继续生效,用户以为热键坏了
- 没有任何渠道让用户知道"刚才那一下没保存"
建议接受标准
不在范围
HotkeySettingsContext.queueSetSettings 内部已经 .catch(() => undefined) 防止打断队列,本 issue 不重构队列设计
- SelectionAsk 同类问题独立 issue
现象
openless-all/app/src/pages/Translation.tsx所有写操作都是 fire-and-forget(不 await,或 await 但不 try/catch),UI 不显示 saving / saved / failed 任一状态:Translation.tsx:69-87Translation.tsx:34-41savePrefs({ ...prefs, workingLanguages })Translation.tsx:114<select>Translation.tsx:42-43savePrefs({ ...prefs, translationTargetLanguage })Translation.tsx:143ShortcutRecorderTranslation.tsx:145-148await setTranslationHotkey(binding); await savePrefs(...)savePrefs即useHotkeySettings().updatePrefs(src/state/HotkeySettingsContext.tsx:94-104),内部走串行队列调set_settings。完整链路(UI → IPC → Rust handler)
savePrefs(...)queueSetSettings串行后调setSettingssrc/lib/ipc.ts:142→invokeOrMock('set_settings', { prefs }, …)commands.rs:116set_settings(…)setTranslationHotkey(binding)src/lib/ipc.ts:340→invokeOrMock('set_translation_hotkey', { binding }, …)commands.rs:850set_translation_hotkey(…)失败路径
set_settings落盘失败 /set_translation_hotkey注册热键失败 → 队列里的 task reject →await savePrefs(...)rejecttoggleWorkingLanguage/onTargetChange是() => savePrefs(...)形式,调用方根本没 await,promise rejection 进 unhandledonSave链了两个 await 但没 try/catch,第一个 reject 后第二个就不跑用户可见后果
setTranslationHotkey失败、savePrefs也没跑 → 旧热键继续生效,用户以为热键坏了建议接受标准
setTranslationHotkeyreject 时不要继续调savePrefs,且 banner 注明是哪一步失败不在范围
HotkeySettingsContext.queueSetSettings内部已经.catch(() => undefined)防止打断队列,本 issue 不重构队列设计