refactor: add debounce to optimize config updates and provider refresh handling

This commit is contained in:
wonfen
2025-05-25 21:34:48 +08:00
parent d3dbc11b1b
commit af1689ee07
7 changed files with 207 additions and 21 deletions

View File

@@ -170,6 +170,8 @@ const Layout = () => {
// 设置监听器
useEffect(() => {
let providersDebounceTimer: ReturnType<typeof setTimeout> | undefined;
const listeners = [
addListener("verge://refresh-clash-config", async () => {
await getAxios(true);
@@ -185,6 +187,18 @@ const Layout = () => {
mutate("getAutotemProxy");
}),
addListener("verge://refresh-providers-proxies", () => {
if (providersDebounceTimer) {
clearTimeout(providersDebounceTimer);
}
providersDebounceTimer = setTimeout(() => {
console.log('[Layout] Debounced refresh-providers-proxies event');
mutate("getProxyProviders");
providersDebounceTimer = undefined;
}, 500);
}),
addListener("verge://notice-message", ({ payload }) =>
handleNotice(payload as [string, string]),
),
@@ -206,6 +220,10 @@ const Layout = () => {
const cleanupWindow = setupWindowListeners();
return () => {
if (providersDebounceTimer) {
clearTimeout(providersDebounceTimer);
}
listeners.forEach((listener) => {
if (typeof listener.then === "function") {
listener.then((unlisten) => unlisten());

View File

@@ -297,17 +297,28 @@ const ProfilePage = () => {
// 监听后端配置变更
useEffect(() => {
let unlistenPromise: Promise<() => void> | undefined;
let timeoutId: ReturnType<typeof setTimeout> | undefined;
const setupListener = async () => {
unlistenPromise = listen<string>('profile-changed', (event) => {
console.log('Profile changed event received:', event.payload);
mutateProfiles();
if (timeoutId) {
clearTimeout(timeoutId);
}
timeoutId = setTimeout(() => {
mutateProfiles();
timeoutId = undefined;
}, 300);
});
};
setupListener();
return () => {
if (timeoutId) {
clearTimeout(timeoutId);
}
unlistenPromise?.then(unlisten => unlisten());
};
}, [mutateProfiles, t]);

View File

@@ -198,6 +198,11 @@ export const getProxyProviders = async () => {
const response = await invoke<{
providers: Record<string, IProxyProviderItem>;
}>("get_providers_proxies");
if (!response || !response.providers) {
console.warn("getProxyProviders: Invalid response structure, returning empty object");
return {};
}
const providers = response.providers as Record<string, IProxyProviderItem>;
return Object.fromEntries(