refactor: reduce duplicated separately useSWR (#6153)

* refactor: reduce duplicated seperatlly useSWR

* refactor: streamline useSWR integration and improve error handling
This commit is contained in:
Tunglies 2026-01-25 15:14:45 +08:00 committed by GitHub
parent bf189bb144
commit c7462716e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 25 additions and 34 deletions

View File

@ -22,8 +22,7 @@ import {
useState, useState,
} from "react"; } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import useSWR, { mutate } from "swr"; import { mutate } from "swr";
import { getBaseConfig } from "tauri-plugin-mihomo-api";
import { import {
BaseDialog, BaseDialog,
@ -113,6 +112,8 @@ export const SysproxyViewer = forwardRef<DialogRef>((props, ref) => {
type AutoProxy = Awaited<ReturnType<typeof getAutotemProxy>>; type AutoProxy = Awaited<ReturnType<typeof getAutotemProxy>>;
const [autoproxy, setAutoproxy] = useState<AutoProxy>(); const [autoproxy, setAutoproxy] = useState<AutoProxy>();
const { clashConfig } = useAppData();
const { const {
enable_system_proxy: enabled, enable_system_proxy: enabled,
proxy_auto_config, proxy_auto_config,
@ -148,13 +149,6 @@ export const SysproxyViewer = forwardRef<DialogRef>((props, ref) => {
return "127.0.0.1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,localhost,*.local,*.crashlytics.com,<local>"; return "127.0.0.1,192.168.0.0/16,10.0.0.0/8,172.16.0.0/12,localhost,*.local,*.crashlytics.com,<local>";
}; };
const { data: clashConfig } = useSWR("getClashConfig", getBaseConfig, {
revalidateOnFocus: false,
revalidateIfStale: true,
dedupingInterval: 1000,
errorRetryInterval: 5000,
});
const prevMixedPortRef = useRef(clashConfig?.mixedPort); const prevMixedPortRef = useRef(clashConfig?.mixedPort);
useEffect(() => { useEffect(() => {

View File

@ -3,13 +3,13 @@ import { Box, Button, ButtonGroup } from "@mui/material";
import { useLockFn } from "ahooks"; import { useLockFn } from "ahooks";
import { useCallback, useEffect, useMemo, useReducer, useState } from "react"; import { useCallback, useEffect, useMemo, useReducer, useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import useSWR from "swr"; import { closeAllConnections } from "tauri-plugin-mihomo-api";
import { closeAllConnections, getBaseConfig } from "tauri-plugin-mihomo-api";
import { BasePage } from "@/components/base"; import { BasePage } from "@/components/base";
import { ProviderButton } from "@/components/proxy/provider-button"; import { ProviderButton } from "@/components/proxy/provider-button";
import { ProxyGroups } from "@/components/proxy/proxy-groups"; import { ProxyGroups } from "@/components/proxy/proxy-groups";
import { useVerge } from "@/hooks/use-verge"; import { useVerge } from "@/hooks/use-verge";
import { useAppData } from "@/providers/app-data-context";
import { import {
getRuntimeProxyChainConfig, getRuntimeProxyChainConfig,
patchClashMode, patchClashMode,
@ -41,21 +41,11 @@ const ProxyPage = () => {
null as string | null, null as string | null,
); );
const { clashConfig, refreshClashConfig } = useAppData();
const updateChainConfigData = useCallback((value: string | null) => { const updateChainConfigData = useCallback((value: string | null) => {
dispatchChainConfigData(value); dispatchChainConfigData(value);
}, []); }, []);
const { data: clashConfig, mutate: mutateClash } = useSWR(
"getClashConfig",
getBaseConfig,
{
revalidateOnFocus: false,
revalidateIfStale: true,
dedupingInterval: 1000,
errorRetryInterval: 5000,
},
);
const { verge } = useVerge(); const { verge } = useVerge();
const modeList = useMemo(() => MODES, []); const modeList = useMemo(() => MODES, []);
@ -69,7 +59,7 @@ const ProxyPage = () => {
closeAllConnections(); closeAllConnections();
} }
await patchClashMode(mode); await patchClashMode(mode);
mutateClash(); refreshClashConfig();
}); });
const onToggleChainMode = useLockFn(async () => { const onToggleChainMode = useLockFn(async () => {

View File

@ -44,7 +44,7 @@ export const useAppData = () => {
const context = use(AppDataContext); const context = use(AppDataContext);
if (!context) { if (!context) {
throw new Error("useAppData必须在AppDataProvider内使用"); throw new Error("useAppData must be used within AppDataProvider");
} }
return context; return context;

View File

@ -15,7 +15,7 @@ import {
getRunningMode, getRunningMode,
getSystemProxy, getSystemProxy,
} from "@/services/cmds"; } from "@/services/cmds";
import { SWR_DEFAULTS, SWR_REALTIME, SWR_SLOW_POLL } from "@/services/config"; import { SWR_DEFAULTS, SWR_MIHOMO, SWR_REALTIME } from "@/services/config";
import { AppDataContext, AppDataContextType } from "./app-data-context"; import { AppDataContext, AppDataContextType } from "./app-data-context";
@ -43,25 +43,25 @@ export const AppDataProvider = ({
const { data: clashConfig, mutate: refreshClashConfig } = useSWR( const { data: clashConfig, mutate: refreshClashConfig } = useSWR(
"getClashConfig", "getClashConfig",
getBaseConfig, getBaseConfig,
SWR_SLOW_POLL, SWR_MIHOMO,
); );
const { data: proxyProviders, mutate: refreshProxyProviders } = useSWR( const { data: proxyProviders, mutate: refreshProxyProviders } = useSWR(
"getProxyProviders", "getProxyProviders",
calcuProxyProviders, calcuProxyProviders,
SWR_DEFAULTS, SWR_MIHOMO,
); );
const { data: ruleProviders, mutate: refreshRuleProviders } = useSWR( const { data: ruleProviders, mutate: refreshRuleProviders } = useSWR(
"getRuleProviders", "getRuleProviders",
getRuleProviders, getRuleProviders,
SWR_DEFAULTS, SWR_MIHOMO,
); );
const { data: rulesData, mutate: refreshRules } = useSWR( const { data: rulesData, mutate: refreshRules } = useSWR(
"getRules", "getRules",
getRules, getRules,
SWR_DEFAULTS, SWR_MIHOMO,
); );
useEffect(() => { useEffect(() => {

View File

@ -1,4 +1,12 @@
import { useSWRConfig } from "swr"; const SWR_NOT_SMART = {
revalidateOnFocus: false,
revalidateOnReconnect: false,
revalidateIfStale: false,
suspense: false,
errorRetryCount: 2,
dedupingInterval: 1500,
errorRetryInterval: 3000,
} as const;
export const SWR_DEFAULTS = { export const SWR_DEFAULTS = {
revalidateOnFocus: false, revalidateOnFocus: false,
@ -19,7 +27,6 @@ export const SWR_SLOW_POLL = {
refreshInterval: 60000, refreshInterval: 60000,
} as const; } as const;
export const useSWRMutate = () => { export const SWR_MIHOMO = {
const { mutate } = useSWRConfig(); ...SWR_NOT_SMART,
return mutate;
}; };