From 541b78ba6f4f2232a5ed99969ea79c0e685be5b5 Mon Sep 17 00:00:00 2001 From: wonfen Date: Sat, 19 Apr 2025 22:23:58 +0800 Subject: [PATCH] fix: restart clash core after change it --- src-tauri/src/cmd/clash.rs | 19 +++++++++++++++---- .../setting/mods/clash-core-viewer.tsx | 11 ++++++++--- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src-tauri/src/cmd/clash.rs b/src-tauri/src/cmd/clash.rs index e07f84e9..852c3151 100644 --- a/src-tauri/src/cmd/clash.rs +++ b/src-tauri/src/cmd/clash.rs @@ -40,10 +40,21 @@ pub async fn change_clash_core(clash_core: String) -> CmdResult> .await { Ok(_) => { - log::info!(target: "app", "core changed to {clash_core}"); - handle::Handle::notice_message("config_core::change_success", &clash_core); - handle::Handle::refresh_clash(); - Ok(None) + // 切换内核后重启内核 + match CoreManager::global().restart_core().await { + Ok(_) => { + log::info!(target: "app", "core changed and restarted to {clash_core}"); + handle::Handle::notice_message("config_core::change_success", &clash_core); + handle::Handle::refresh_clash(); + Ok(None) + } + Err(err) => { + let error_msg = format!("Core changed but failed to restart: {}", err); + log::error!(target: "app", "{}", error_msg); + handle::Handle::notice_message("config_core::change_error", &error_msg); + Ok(Some(error_msg)) + } + } } Err(err) => { let error_msg = err.to_string(); diff --git a/src/components/setting/mods/clash-core-viewer.tsx b/src/components/setting/mods/clash-core-viewer.tsx index dbc69392..969d3c81 100644 --- a/src/components/setting/mods/clash-core-viewer.tsx +++ b/src/components/setting/mods/clash-core-viewer.tsx @@ -45,13 +45,18 @@ export const ClashCoreViewer = forwardRef((props, ref) => { try { closeAllConnections(); - await changeClashCore(core); + const errorMsg = await changeClashCore(core); + + if (errorMsg) { + Notice.error(errorMsg); + return; + } + mutateVerge(); setTimeout(() => { mutate("getClashConfig"); mutate("getVersion"); - }, 100); - // Notice.success(t("Switched to _clash Core", { core: `${core}` }), 1000); + }, 500); } catch (err: any) { Notice.error(err?.message || err.toString()); }