Skip to content

[ui][bug] HotkeySettingsContext.refresh 失败 loading 永卡 — 所有依赖此 context 的页面陪葬 #316

@appergb

Description

@appergb

现象

openless-all/app/src/state/HotkeySettingsContext.tsx:35-40refresh()

const refresh = useCallback(async () => {
  const [nextPrefs, nextCapability] = await Promise.all([getSettings(), getHotkeyCapability()]);
  setPrefs(nextPrefs);
  setCapability(nextCapability);
  setLoading(false);          // ← 任一 IPC reject 时永远不执行
}, []);

Promise.all 里任一 reject → setLoading(false) 不跑 → context 永远 loading = true / prefs = null

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

  • 调用方:HotkeySettingsProvider 在挂载时 void refresh()HotkeySettingsContext.tsx:55-57
  • IPC:
    • getSettings() src/lib/ipc.tsinvokeOrMock('get_settings', …)commands.rs get_settings
    • getHotkeyCapability() src/lib/ipc.tsinvokeOrMock('get_hotkey_capability', …)commands.rs get_hotkey_capability

影响范围(不止一页)

context 拿不到 prefs,下面这些页面都会卡:

页面 卡死表现
Translation.tsx:19-32 渲染 loading Card,无重试入口
SelectionAsk.tsx:22-38 同上
Style.tsx:49-57 header 显示 t('common.loading') 兜底
History.tsx(用 prefs 渲染热键 label) 列表显示但热键提示空
Overview.tsx(同上) 顶栏 kbd 显示空

且整个 app 的 useHotkeySettings() 返回的 prefs / capability 都是 null,所有依赖 prefs 的逻辑(如热键提示、保存)都要做 null guard 或者跑不动。

失败触发场景

  • preferences.json 损坏,get_settings 返回 Err(String) 反序列化失败
  • get_hotkey_capability 后端探测异常(cold start hotkey monitor race / 第一次 TCC 拒绝)
  • IPC 通道异常(Tauri webview 启动早于 backend)

建议接受标准

  • refresh() 加 try/catch/finally,finally { setLoading(false); } 保证 loading 一定释放
  • context value 增加 error: string | null,让消费页可以渲染"设置加载失败 / 重试"
  • 至少一个页(如 Translation)在 error != null 时显示重试按钮
  • 不要把局部错误升级成全局 fatal —— prefs 拿不到时仍然让 app 可见,让用户看到错误而不是白屏

不在范围

  • 不重构整个 context API
  • preferences.json 自动恢复策略不在本 issue(属于 persistence 层)

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