现象
openless-all/app/src/state/HotkeySettingsContext.tsx:35-40 的 refresh():
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.ts → invokeOrMock('get_settings', …) → commands.rs get_settings
getHotkeyCapability() src/lib/ipc.ts → invokeOrMock('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)
建议接受标准
不在范围
- 不重构整个 context API
preferences.json 自动恢复策略不在本 issue(属于 persistence 层)
现象
openless-all/app/src/state/HotkeySettingsContext.tsx:35-40的refresh():Promise.all里任一 reject →setLoading(false)不跑 → context 永远loading = true / prefs = null。完整链路(UI → IPC → Rust handler)
HotkeySettingsProvider在挂载时void refresh()(HotkeySettingsContext.tsx:55-57)getSettings()src/lib/ipc.ts→invokeOrMock('get_settings', …)→commands.rsget_settingsgetHotkeyCapability()src/lib/ipc.ts→invokeOrMock('get_hotkey_capability', …)→commands.rsget_hotkey_capability影响范围(不止一页)
context 拿不到 prefs,下面这些页面都会卡:
Translation.tsx:19-32SelectionAsk.tsx:22-38Style.tsx:49-57t('common.loading')兜底History.tsx(用prefs渲染热键 label)Overview.tsx(同上)且整个 app 的
useHotkeySettings()返回的prefs / capability都是 null,所有依赖 prefs 的逻辑(如热键提示、保存)都要做 null guard 或者跑不动。失败触发场景
preferences.json损坏,get_settings返回Err(String)反序列化失败get_hotkey_capability后端探测异常(cold start hotkey monitor race / 第一次 TCC 拒绝)建议接受标准
refresh()加 try/catch/finally,finally { setLoading(false); }保证 loading 一定释放error: string | null,让消费页可以渲染"设置加载失败 / 重试"error != null时显示重试按钮不在范围
preferences.json自动恢复策略不在本 issue(属于 persistence 层)