diff --git a/openless-all/app/src-tauri/src/commands.rs b/openless-all/app/src-tauri/src/commands.rs index f3cd82d1..79a8f5b4 100644 --- a/openless-all/app/src-tauri/src/commands.rs +++ b/openless-all/app/src-tauri/src/commands.rs @@ -783,10 +783,15 @@ pub fn set_credential(window: Window, account: String, value: String) -> Result< ensure_main_window(&window)?; let acc = parse_account(&account)?; if value.is_empty() { - CredentialsVault::remove(acc).map_err(|e| e.to_string()) + CredentialsVault::remove(acc).map_err(|e| e.to_string())?; } else { - CredentialsVault::set(acc, &value).map_err(|e| e.to_string()) + CredentialsVault::set(acc, &value).map_err(|e| e.to_string())?; } + // 通知前端凭据已变更(如 Overview 页需要刷新 asrConfigured 状态)。 + // issue #532 / #573:在 Settings 填写凭据但不切换提供商时,Overview 不会重拉状态, + // 仍显示「未配置」。该修复曾随 #538 合入 main,但被 beta→main 合并覆盖,beta 上缺失。 + let _ = window.emit("credentials:changed", ()); + Ok(()) } #[tauri::command] diff --git a/openless-all/app/src/pages/Overview.tsx b/openless-all/app/src/pages/Overview.tsx index 609fbe47..9c43e3f1 100644 --- a/openless-all/app/src/pages/Overview.tsx +++ b/openless-all/app/src/pages/Overview.tsx @@ -101,6 +101,34 @@ export function Overview({ onOpenHistory }: OverviewProps) { refreshCredentials(); }, [refreshCredentials, prefs?.activeAsrProvider, prefs?.activeLlmProvider]); + // 凭据被保存后重新拉取状态(issue #532 / #573:在 Settings 中填写/更新凭据 + // 但不切换提供商时,上面的 useEffect 不会重跑,导致概览页的状态仍停留在「未配置」)。 + // 复用 refreshCredentials() 以带上 credentialsRequestSeq 防竞态。 + useEffect(() => { + let cancelled = false; + let unlisten: (() => void) | undefined; + (async () => { + try { + const { listen } = await import('@tauri-apps/api/event'); + const handle = await listen('credentials:changed', () => { + if (cancelled) return; + refreshCredentials(); + }); + if (cancelled) { + handle(); + } else { + unlisten = handle; + } + } catch { + // browser dev mock — 没有 Tauri event bridge + } + })(); + return () => { + cancelled = true; + unlisten?.(); + }; + }, [refreshCredentials]); + const metrics = useMemo(() => { const today = new Date(); today.setHours(0, 0, 0, 0);