add proxy memu in tray

This commit is contained in:
Kasserrr
2025-08-28 01:25:09 +08:00
parent d58c0a7df5
commit f566a564af
7 changed files with 345 additions and 29 deletions
+8 -1
View File
@@ -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();
+11
View File
@@ -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);
}
},
);
+71 -9
View File
@@ -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);
+4
View File
@@ -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;