feat: add backend config change listener to update frontend state

This commit is contained in:
wonfen 2025-05-04 13:28:08 +08:00
parent 23b0493d0b
commit ff5a2c6ca4
3 changed files with 31 additions and 0 deletions

View File

@ -17,6 +17,7 @@
- Vless URL 解码时网络类型错误 - Vless URL 解码时网络类型错误
- 切换自定义代理地址导致系统代理状态异常 - 切换自定义代理地址导致系统代理状态异常
- Macos TUN 默认无效网卡名称 - Macos TUN 默认无效网卡名称
- 托盘更改订阅后 UI 不同步的问题
#### 新增了: #### 新增了:
- 允许代理主机地址设置为非 127.0.0.1 对 WSL 代理友好 - 允许代理主机地址设置为非 127.0.0.1 对 WSL 代理友好
@ -43,6 +44,7 @@
- 改进核心功能防止主进程阻塞、改进MihomoManager实现以及优化窗口创建流程。减少应用程序可能出现的主进程卡死情况 - 改进核心功能防止主进程阻塞、改进MihomoManager实现以及优化窗口创建流程。减少应用程序可能出现的主进程卡死情况
- 优化系统代理设置更新逻辑 - 优化系统代理设置更新逻辑
- 重构前端通知系统分离通知线程防止前端卡死 - 重构前端通知系统分离通知线程防止前端卡死
- 优化网络请求和错误处理
## v2.2.3 ## v2.2.3

View File

@ -146,6 +146,9 @@ pub async fn patch_profiles_config(profiles: IProfiles) -> CmdResult<bool> {
// 更新profiles配置 // 更新profiles配置
logging!(info, Type::Cmd, true, "正在更新配置草稿"); logging!(info, Type::Cmd, true, "正在更新配置草稿");
let current_value = profiles.current.clone();
let _ = Config::profiles().draft().patch_config(profiles); let _ = Config::profiles().draft().patch_config(profiles);
// 更新配置并进行验证 // 更新配置并进行验证
@ -156,6 +159,14 @@ pub async fn patch_profiles_config(profiles: IProfiles) -> CmdResult<bool> {
let _ = Tray::global().update_tooltip(); let _ = Tray::global().update_tooltip();
Config::profiles().apply(); Config::profiles().apply();
wrap_err!(Config::profiles().data().save_file())?; wrap_err!(Config::profiles().data().save_file())?;
if let Some(window) = handle::Handle::global().get_window() {
if let Some(current) = &current_value {
logging!(info, Type::Cmd, true, "向前端发送配置变更事件: {}", current);
let _ = window.emit("profile-changed", current.clone());
}
}
Ok(true) Ok(true)
} }
Ok((false, error_msg)) => { Ok((false, error_msg)) => {

View File

@ -295,6 +295,24 @@ const ProfilePage = () => {
? "rgba(0, 0, 0, 0.06)" ? "rgba(0, 0, 0, 0.06)"
: "rgba(255, 255, 255, 0.06)"; : "rgba(255, 255, 255, 0.06)";
// 监听后端配置变更
useEffect(() => {
let unlistenPromise: Promise<() => void> | undefined;
const setupListener = async () => {
unlistenPromise = listen<string>('profile-changed', (event) => {
console.log('Profile changed event received:', event.payload);
mutateProfiles();
});
};
setupListener();
return () => {
unlistenPromise?.then(unlisten => unlisten());
};
}, [mutateProfiles, t]);
return ( return (
<BasePage <BasePage
full full