From 2fd6be642e217b8d168fdf1af6524ac19667b390 Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Wed, 28 Oct 2026 10:52:02 +0800 Subject: [PATCH] refactor(services): drop the bespoke retry engine from the query wrapper The custom onErrorRetry existed only to honor a function-form retryDelay, which exactly one caller (the app data provider) used for exponential backoff. Fall back to SWR's built-in error retry and express that caller's cadence with constant options. --- src/providers/app-data-provider.tsx | 4 +++- src/services/query-client.ts | 20 ++------------------ 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/src/providers/app-data-provider.tsx b/src/providers/app-data-provider.tsx index 731d7ea20..f66b85659 100644 --- a/src/providers/app-data-provider.tsx +++ b/src/providers/app-data-provider.tsx @@ -26,7 +26,9 @@ const TQ_MIHOMO = { refetchOnReconnect: false, staleTime: 1500, retry: 3, - retryDelay: (attempt: number) => Math.min(200 * 2 ** attempt, 3000), + // SWR's default retry waits about 2^retryCount * errorRetryInterval with + // jitter, so 100 reproduces the previous 200 * 2^attempt backoff. + retryDelay: 100, } as const const TQ_DEFAULTS = { diff --git a/src/services/query-client.ts b/src/services/query-client.ts index 2bbdf1f81..1a1c04e72 100644 --- a/src/services/query-client.ts +++ b/src/services/query-client.ts @@ -18,7 +18,7 @@ type QueryOptions = { placeholderData?: T | (() => T | undefined) staleTime?: number retry?: number | false - retryDelay?: number | ((attempt: number) => number) + retryDelay?: number refetchInterval?: number | false refetchIntervalInBackground?: boolean revalidateOnMount?: boolean @@ -90,25 +90,9 @@ export function useQuery(options: QueryOptions): QueryResult { const swr = useSWR(enabled ? queryKey : null, queryFn, { dedupingInterval: staleTime, errorRetryCount: retry === false ? 0 : retry, - errorRetryInterval: - typeof retryDelay === 'number' - ? retryDelay - : swrConfig.errorRetryInterval, + errorRetryInterval: retryDelay ?? swrConfig.errorRetryInterval, fallbackData, keepPreviousData: placeholderData !== undefined, - onErrorRetry: (_error, _key, config, revalidate, { retryCount }) => { - const maxRetries = config.errorRetryCount - if (maxRetries !== undefined && retryCount > maxRetries) return - - const interval = - typeof retryDelay === 'function' - ? retryDelay(Math.max(retryCount - 1, 0)) - : config.errorRetryInterval - - setTimeout(() => { - revalidate({ retryCount, dedupe: true }) - }, interval) - }, revalidateOnFocus: refetchOnWindowFocus, revalidateOnMount, revalidateOnReconnect: refetchOnReconnect,