From 4b9cca12d3b9e6ce9418c4573e3738daa8ab43e5 Mon Sep 17 00:00:00 2001 From: YoVinchen Date: Mon, 19 Jan 2026 23:36:06 +0800 Subject: [PATCH] fix(tray): restore tray-provider events and enable Auto failover properly - Emit provider-switched event on tray provider click (backward compatibility) - Auto button now: starts proxy, takes over live config, enables failover --- src-tauri/src/tray.rs | 38 +++++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/src-tauri/src/tray.rs b/src-tauri/src/tray.rs index f07b262c9..7cff143e4 100644 --- a/src-tauri/src/tray.rs +++ b/src-tauri/src/tray.rs @@ -211,27 +211,51 @@ fn handle_auto_click(app: &tauri::AppHandle, app_type: &AppType) -> Result<(), A if let Some(app_state) = app.try_state::() { let app_type_str = app_type.as_str(); - // 启用 proxy 和 auto_failover + // 真正启用 failover:启动代理服务 + 执行接管 + 开启 auto_failover + let proxy_service = &app_state.proxy_service; + + // 1) 确保代理服务运行(会自动设置 proxy_enabled = true) + let is_running = futures::executor::block_on(proxy_service.is_running()); + if !is_running { + log::info!("[Tray] Auto 模式:启动代理服务"); + if let Err(e) = futures::executor::block_on(proxy_service.start()) { + log::error!("[Tray] 启动代理服务失败: {e}"); + return Err(AppError::Message(format!("启动代理服务失败: {e}"))); + } + } + + // 2) 执行 Live 配置接管(确保该 app 被代理接管) + log::info!("[Tray] Auto 模式:对 {} 执行接管", app_type_str); + if let Err(e) = futures::executor::block_on(proxy_service.set_takeover_for_app(app_type_str, true)) { + log::error!("[Tray] 执行接管失败: {e}"); + return Err(AppError::Message(format!("执行接管失败: {e}"))); + } + + // 3) 设置 auto_failover_enabled = true app_state .db .set_proxy_flags_sync(app_type_str, true, true)?; - // 更新托盘菜单 + // 4) 更新托盘菜单 if let Ok(new_menu) = create_tray_menu(app, app_state.inner()) { if let Some(tray) = app.tray_by_id("main") { let _ = tray.set_menu(Some(new_menu)); } } - // 发射事件到前端 + // 5) 发射事件到前端 let event_data = serde_json::json!({ "appType": app_type_str, "proxyEnabled": true, "autoFailoverEnabled": true }); - if let Err(e) = app.emit("proxy-flags-changed", event_data) { + if let Err(e) = app.emit("proxy-flags-changed", event_data.clone()) { log::error!("发射 proxy-flags-changed 事件失败: {e}"); } + // 发射 provider-switched 事件(保持向后兼容,Auto 切换也算一种切换) + if let Err(e) = app.emit("provider-switched", event_data) { + log::error!("发射 provider-switched 事件失败: {e}"); + } } Ok(()) } @@ -273,9 +297,13 @@ fn handle_provider_click( "autoFailoverEnabled": false, "providerId": provider_id }); - if let Err(e) = app.emit("proxy-flags-changed", event_data) { + if let Err(e) = app.emit("proxy-flags-changed", event_data.clone()) { log::error!("发射 proxy-flags-changed 事件失败: {e}"); } + // 发射 provider-switched 事件(保持向后兼容) + if let Err(e) = app.emit("provider-switched", event_data) { + log::error!("发射 provider-switched 事件失败: {e}"); + } } Ok(()) }