refactor: streamline SWR configuration and improve error handling in AppDataProvider

This commit is contained in:
xmk23333
2025-10-21 17:51:12 +08:00
parent bafe2ae164
commit 0e933597f5
18 changed files with 1139 additions and 1383 deletions

View File

@@ -15,6 +15,7 @@ import {
getRunningMode,
getSystemProxy,
} from "@/services/cmds";
import { SWR_DEFAULTS, SWR_REALTIME, SWR_SLOW_POLL } from "@/services/config";
import { AppDataContext, AppDataContextType } from "./app-data-context";
@@ -30,61 +31,33 @@ export const AppDataProvider = ({
"getProxies",
calcuProxies,
{
refreshInterval: 8000,
revalidateOnFocus: false,
suspense: false,
errorRetryCount: 2,
dedupingInterval: 3000,
onError: (err) => {
console.warn("[DataProvider] 代理数据获取失败:", err);
},
...SWR_REALTIME,
onError: (err) => console.warn("[DataProvider] Proxy fetch failed:", err),
},
);
const { data: clashConfig, mutate: refreshClashConfig } = useSWR(
"getClashConfig",
getBaseConfig,
{
refreshInterval: 60000,
revalidateOnFocus: false,
suspense: false,
errorRetryCount: 2,
dedupingInterval: 5000,
},
SWR_SLOW_POLL,
);
const { data: proxyProviders, mutate: refreshProxyProviders } = useSWR(
"getProxyProviders",
calcuProxyProviders,
{
revalidateOnFocus: false,
revalidateOnReconnect: false,
dedupingInterval: 5000,
suspense: false,
errorRetryCount: 2,
},
SWR_DEFAULTS,
);
const { data: ruleProviders, mutate: refreshRuleProviders } = useSWR(
"getRuleProviders",
getRuleProviders,
{
revalidateOnFocus: false,
suspense: false,
errorRetryCount: 2,
dedupingInterval: 5000,
},
SWR_DEFAULTS,
);
const { data: rulesData, mutate: refreshRules } = useSWR(
"getRules",
getRules,
{
revalidateOnFocus: false,
suspense: false,
errorRetryCount: 2,
dedupingInterval: 5000,
},
SWR_DEFAULTS,
);
useEffect(() => {
@@ -101,7 +74,7 @@ export const AppDataProvider = ({
try {
fn();
} catch (error) {
console.error("[数据提供者] 立即清理失败:", error);
console.error("[DataProvider] Immediate cleanup failed:", error);
}
} else {
cleanupFns.push(fn);
@@ -151,10 +124,10 @@ export const AppDataProvider = ({
scheduleTimeout(() => {
refreshRules().catch((error) =>
console.warn("[数据提供者] 规则刷新失败:", error),
console.warn("[DataProvider] Rules refresh failed:", error),
);
refreshRuleProviders().catch((error) =>
console.warn("[数据提供者] 规则提供者刷新失败:", error),
console.warn("[DataProvider] Rule providers refresh failed:", error),
);
}, 200);
};
@@ -166,7 +139,7 @@ export const AppDataProvider = ({
lastUpdateTime = now;
scheduleTimeout(() => {
refreshProxy().catch((error) =>
console.error("[数据提供者] 代理刷新失败:", error),
console.error("[DataProvider] Proxy refresh failed:", error),
);
}, 200);
};
@@ -178,7 +151,7 @@ export const AppDataProvider = ({
lastUpdateTime = now;
scheduleTimeout(() => {
refreshProxy().catch((error) =>
console.warn("[数据提供者] 代理刷新失败:", error),
console.warn("[DataProvider] Proxy refresh failed:", error),
);
}, 200);
};
@@ -241,7 +214,7 @@ export const AppDataProvider = ({
if (errors.length > 0) {
console.error(
`[数据提供者] 清理过程中发生 ${errors.length} 个错误:`,
`[DataProvider] ${errors.length} errors during cleanup:`,
errors,
);
}
@@ -251,26 +224,18 @@ export const AppDataProvider = ({
const { data: sysproxy, mutate: refreshSysproxy } = useSWR(
"getSystemProxy",
getSystemProxy,
{
revalidateOnFocus: false,
revalidateOnReconnect: false,
suspense: false,
errorRetryCount: 2,
dedupingInterval: 5000,
},
SWR_DEFAULTS,
);
const { data: runningMode } = useSWR("getRunningMode", getRunningMode, {
revalidateOnFocus: false,
suspense: false,
errorRetryCount: 2,
dedupingInterval: 5000,
});
const { data: runningMode } = useSWR(
"getRunningMode",
getRunningMode,
SWR_DEFAULTS,
);
const { data: uptimeData } = useSWR("appUptime", getAppUptime, {
...SWR_DEFAULTS,
refreshInterval: 3000,
revalidateOnFocus: false,
suspense: false,
errorRetryCount: 1,
});

25
src/services/config.ts Normal file
View File

@@ -0,0 +1,25 @@
import { useSWRConfig } from "swr";
export const SWR_DEFAULTS = {
revalidateOnFocus: false,
revalidateOnReconnect: false,
suspense: false,
errorRetryCount: 2,
dedupingInterval: 5000,
} as const;
export const SWR_REALTIME = {
...SWR_DEFAULTS,
refreshInterval: 8000,
dedupingInterval: 3000,
} as const;
export const SWR_SLOW_POLL = {
...SWR_DEFAULTS,
refreshInterval: 60000,
} as const;
export const useSWRMutate = () => {
const { mutate } = useSWRConfig();
return mutate;
};