fix(overview): 凭据保存后状态不刷新仍显示「未配置」 (#573)#590
Conversation
issue #532/#573:在 Settings 填写/更新凭据但不切换提供商时,Overview 页 原有的 useEffect 不会重跑,asrConfigured 仍停留在「未配置」。 该修复曾随 #538 合入 main,但被 beta→main 合并覆盖,beta(开发主分支)上缺失, 导致用户(如 Ubuntu 24.04)配好火山引擎 ASR 后界面仍显示「未配置」。 - commands.rs: set_credential 保存/删除成功后 emit "credentials:changed" - Overview.tsx: 监听该事件调用 refreshCredentials()(复用 credentialsRequestSeq 防竞态, 比 #538 原版裸 getCredentials() 更稳)
|
Claude finished @appergb's task in 1m 29s —— View job 代码审核:PR #590
(1) unlisten 清理 — ✅ 正确,竞态已完全覆盖
// 清理时 listen 还没 resolve → cancelled=true 先设
// listen resolve 之后 → if (cancelled) { handle(); } 立即解注册
if (cancelled) {
handle();
} else {
unlisten = handle;
}两条路径(cleanup 先 / listen 先)都能正确调用 unlisten,不存在泄漏窗口。这是该类异步 Tauri 监听的标准写法,审核通过。 (2) 复用 refreshCredentials() — ✅ 比 #538 原版更稳
const requestSeq = credentialsRequestSeq.current + 1;
credentialsRequestSeq.current = requestSeq;
// …
if (requestSeq !== credentialsRequestSeq.current) return; // 丢弃过期响应相比裸 另外 (3) commands.rs emit 时机 — ✅ 两条路径均覆盖,仅成功时触发// commands.rs:785-794
if value.is_empty() {
CredentialsVault::remove(acc).map_err(|e| e.to_string())?; // 失败 → 提前 return Err
} else {
CredentialsVault::set(acc, &value).map_err(|e| e.to_string())?; // 失败 → 提前 return Err
}
let _ = window.emit("credentials:changed", ()); // 只有成功时才到达这里
Ok(())
小问题(不阻碍合并,供参考)
let _ = window.emit("credentials:changed", ());窗口关闭时 emit 失败是正常且无害的,静默忽略合理。但若想在调试阶段有可见性,可改为: if let Err(e) = window.emit("credentials:changed", ()) {
log::debug!("[set_credential] emit credentials:changed failed: {e}");
}这纯属锦上添花,不影响正确性。 commands.rs 注释较长,包含了问题历史背景(#532/#573/#538 的来龙去脉)。这些内容放在 PR description 里更合适,代码注释只保留"为什么要 emit"的一句话即可。同样不阻碍合并。 总结三个关注点全部审核通过:
建议:Approve and merge to beta。 真机验证(填三件套不切 provider,Overview 立即变已配置)是最后一道关,但逻辑上此修复是完整且正确的。 |
PR Reviewer Guide 🔍Here are some key observations to aid the review process:
|
User description
问题
Closes #573 (亦覆盖 #532 在 beta 上的复现)
用户(如 Ubuntu 24.04)配好火山引擎 ASR 后,概览页仍显示「未配置」。
根因
在 Settings 中填写/更新凭据但不切换提供商时,
Overview原有的两个刷新触发点都不会触发:useEffectprefs?.activeAsrProvider / activeLlmProvider的useEffect(保存凭据不会改 active provider)所以
asrConfigured状态卡在初始的「未配置」,直到手动切换 provider 或重启 App。这个修复曾随 #538 合入
main,但随后被beta → main合并覆盖,开发主分支beta上完全缺失(git grep credentials:changed origin/beta为空)。维护者此前在 issue 回复「更新最新版应该已修了」其实对 beta 用户不成立。改动(单一职责,2 文件 ~35 行)
commands.rs:set_credential保存/删除成功后emit("credentials:changed")Overview.tsx:新增useEffect监听该事件并调用refreshCredentials()相比 #538 原版的改进:监听回调复用既有的
refreshCredentials()(带credentialsRequestSeq防竞态),而非裸getCredentials().then(...),避免并发刷新乱序。验证
tsc --noEmit通过cargo check通过备注
Merge branch beta into main时请确保set_credential的 emit 不再被丢,否则会第三次回退此修复。@claude 请审核。
PR Type
Bug fix
Description
Emit "credentials:changed" event from backend on credential save/remove
Listen for credential updates in Overview to refresh ASR status
Fixes ASR status not updating after saving credentials without switching provider
Diagram Walkthrough
File Walkthrough
commands.rs
Emit credential change event from backendopenless-all/app/src-tauri/src/commands.rs
Overview.tsx
Listen for credential updates in Overviewopenless-all/app/src/pages/Overview.tsx
safety