mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-11-08 19:22:44 +08:00
add proxy memu in tray
This commit is contained in:
@@ -29,7 +29,7 @@ import {
|
||||
} from "@mui/icons-material";
|
||||
import { useNavigate } from "react-router-dom";
|
||||
import { EnhancedCard } from "@/components/home/enhanced-card";
|
||||
import { updateProxy, deleteConnection } from "@/services/cmds";
|
||||
import { updateProxy, deleteConnection, syncTrayProxySelection } from "@/services/cmds";
|
||||
import delayManager from "@/services/delay";
|
||||
import { useVerge } from "@/hooks/use-verge";
|
||||
import { useAppData } from "@/providers/app-data-provider";
|
||||
@@ -342,6 +342,13 @@ export const CurrentProxyCard = () => {
|
||||
});
|
||||
}
|
||||
|
||||
// 同步托盘菜单状态
|
||||
try {
|
||||
await syncTrayProxySelection();
|
||||
} catch (syncError) {
|
||||
console.warn("Failed to sync tray proxy selection:", syncError);
|
||||
}
|
||||
|
||||
// 延长刷新延迟时间
|
||||
setTimeout(() => {
|
||||
refreshProxy();
|
||||
|
||||
@@ -7,6 +7,7 @@ import {
|
||||
updateProxy,
|
||||
deleteConnection,
|
||||
getGroupProxyDelays,
|
||||
syncTrayProxySelection,
|
||||
} from "@/services/cmds";
|
||||
import { forceRefreshProxies } from "@/services/cmds";
|
||||
import { useProfiles } from "@/hooks/use-profiles";
|
||||
@@ -341,6 +342,8 @@ export const ProxyGroups = (props: Props) => {
|
||||
if (!["Selector", "URLTest", "Fallback"].includes(group.type)) return;
|
||||
|
||||
const { name, now } = group;
|
||||
console.log(`[ProxyGroups] GUI代理切换: ${name} -> ${proxy.name}`);
|
||||
|
||||
await updateProxy(name, proxy.name);
|
||||
|
||||
await forceRefreshProxies();
|
||||
@@ -372,6 +375,14 @@ export const ProxyGroups = (props: Props) => {
|
||||
current.selected[index] = { name, now: proxy.name };
|
||||
}
|
||||
await patchCurrent({ selected: current.selected });
|
||||
|
||||
// 同步托盘菜单状态
|
||||
try {
|
||||
await syncTrayProxySelection();
|
||||
console.log(`[ProxyGroups] 托盘状态同步成功: ${name} -> ${proxy.name}`);
|
||||
} catch (error) {
|
||||
console.warn("Failed to sync tray proxy selection:", error);
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
|
||||
@@ -221,16 +221,78 @@ export const AppDataProvider = ({
|
||||
}
|
||||
};
|
||||
|
||||
window.addEventListener(
|
||||
"verge://refresh-clash-config",
|
||||
handleRefreshClash,
|
||||
);
|
||||
// 监听代理配置刷新事件(托盘代理切换等)
|
||||
const handleRefreshProxy = () => {
|
||||
const now = Date.now();
|
||||
console.log("[AppDataProvider] 代理配置刷新事件");
|
||||
|
||||
return () => {
|
||||
window.removeEventListener(
|
||||
"verge://refresh-clash-config",
|
||||
handleRefreshClash,
|
||||
);
|
||||
if (now - lastUpdateTime > refreshThrottle) {
|
||||
lastUpdateTime = now;
|
||||
|
||||
setTimeout(() => {
|
||||
refreshProxy().catch((e) =>
|
||||
console.warn("[AppDataProvider] 代理刷新失败:", e),
|
||||
);
|
||||
}, 100);
|
||||
}
|
||||
};
|
||||
|
||||
// 监听强制代理刷新事件(托盘代理切换立即刷新)
|
||||
const handleForceRefreshProxies = () => {
|
||||
console.log("[AppDataProvider] 强制代理刷新事件");
|
||||
|
||||
// 立即刷新,无延迟,无防抖
|
||||
forceRefreshProxies()
|
||||
.then(() => {
|
||||
console.log("[AppDataProvider] 强制刷新代理缓存完成");
|
||||
// 强制刷新完成后,立即刷新前端显示
|
||||
return refreshProxy();
|
||||
})
|
||||
.then(() => {
|
||||
console.log("[AppDataProvider] 前端代理数据刷新完成");
|
||||
})
|
||||
.catch((e) => {
|
||||
console.warn("[AppDataProvider] 强制代理刷新失败:", e);
|
||||
// 如果强制刷新失败,尝试普通刷新
|
||||
refreshProxy().catch((e2) =>
|
||||
console.warn("[AppDataProvider] 普通代理刷新也失败:", e2),
|
||||
);
|
||||
});
|
||||
};
|
||||
|
||||
// 使用 Tauri 事件监听器替代 window 事件监听器
|
||||
const setupTauriListeners = async () => {
|
||||
try {
|
||||
const unlistenClash = await listen("verge://refresh-clash-config", handleRefreshClash);
|
||||
const unlistenProxy = await listen("verge://refresh-proxy-config", handleRefreshProxy);
|
||||
const unlistenForceRefresh = await listen("verge://force-refresh-proxies", handleForceRefreshProxies);
|
||||
|
||||
return () => {
|
||||
unlistenClash();
|
||||
unlistenProxy();
|
||||
unlistenForceRefresh();
|
||||
};
|
||||
} catch (error) {
|
||||
console.warn("[AppDataProvider] 设置 Tauri 事件监听器失败:", error);
|
||||
|
||||
// 降级到 window 事件监听器
|
||||
window.addEventListener("verge://refresh-clash-config", handleRefreshClash);
|
||||
window.addEventListener("verge://refresh-proxy-config", handleRefreshProxy);
|
||||
window.addEventListener("verge://force-refresh-proxies", handleForceRefreshProxies);
|
||||
|
||||
return () => {
|
||||
window.removeEventListener("verge://refresh-clash-config", handleRefreshClash);
|
||||
window.removeEventListener("verge://refresh-proxy-config", handleRefreshProxy);
|
||||
window.removeEventListener("verge://force-refresh-proxies", handleForceRefreshProxies);
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
const cleanupTauriListeners = setupTauriListeners();
|
||||
|
||||
return async () => {
|
||||
const cleanup = await cleanupTauriListeners;
|
||||
cleanup();
|
||||
};
|
||||
} catch (error) {
|
||||
console.error("[AppDataProvider] 事件监听器设置失败:", error);
|
||||
|
||||
@@ -143,6 +143,10 @@ export async function updateProxy(group: string, proxy: string) {
|
||||
// console.log(`[API] updateProxy 耗时: ${duration}ms`);
|
||||
}
|
||||
|
||||
export async function syncTrayProxySelection() {
|
||||
return invoke<void>("sync_tray_proxy_selection");
|
||||
}
|
||||
|
||||
export async function getProxies(): Promise<{
|
||||
global: IProxyGroupItem;
|
||||
direct: IProxyItem;
|
||||
|
||||
Reference in New Issue
Block a user