Skip to content

Commit 2eabad0

Browse files
authored
feat(packages): refactor query client (#544)
* feat(packages): Refactor QueryClient initialization in Providers component to use createQueryClient function for improved configuration.
1 parent e8433b4 commit 2eabad0

File tree

2 files changed

+70
-2
lines changed

2 files changed

+70
-2
lines changed
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
import { MutationCache, QueryCache, QueryClient } from "@tanstack/react-query";
2+
3+
const calculateRetryDelay = (attemptIndex: number): number => {
4+
return Math.min(1000 * 2 ** attemptIndex, 30000);
5+
};
6+
7+
const shouldRetry = (failureCount: number, error: Error): boolean => {
8+
if (failureCount >= 3) {
9+
return false;
10+
}
11+
12+
if (error.message?.includes("rejected")) {
13+
return false;
14+
}
15+
16+
if (error.message?.includes("User rejected")) {
17+
return false;
18+
}
19+
20+
return true;
21+
};
22+
23+
const logError = (error: Error, context?: string): void => {
24+
const errorContext = context ? `[${context}]` : "";
25+
console.error(`React Query Error ${errorContext}:`, {
26+
message: error.message,
27+
stack: error.stack,
28+
name: error.name,
29+
});
30+
};
31+
32+
export const createQueryClient = (): QueryClient => {
33+
const queryCache = new QueryCache({
34+
onError: (error) => {
35+
logError(error, "Query");
36+
},
37+
});
38+
39+
const mutationCache = new MutationCache({
40+
onError: (error) => {
41+
logError(error, "Mutation");
42+
},
43+
});
44+
45+
return new QueryClient({
46+
queryCache,
47+
mutationCache,
48+
defaultOptions: {
49+
queries: {
50+
retry: (failureCount, error) => {
51+
return shouldRetry(failureCount, error as Error);
52+
},
53+
retryDelay: calculateRetryDelay,
54+
staleTime: 60000,
55+
gcTime: 5 * 60 * 1000,
56+
refetchOnWindowFocus: false,
57+
refetchOnReconnect: true,
58+
},
59+
mutations: {
60+
retry: (failureCount, error) => {
61+
return shouldRetry(failureCount, error as Error);
62+
},
63+
retryDelay: calculateRetryDelay,
64+
},
65+
},
66+
});
67+
};

services/vault/src/providers.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import { CoreUIProvider, ScrollLocker } from "@babylonlabs-io/core-ui";
2-
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
2+
import { QueryClientProvider } from "@tanstack/react-query";
33
import { ReactQueryDevtools } from "@tanstack/react-query-devtools";
44
import { ThemeProvider } from "next-themes";
55
import { Suspense, useEffect, useRef, useState } from "react";
66

77
import { NotificationContainer } from "@/components/NotificationContainer";
8+
import { createQueryClient } from "@/config/queryClient";
89
import { VaultWalletConnectionProvider } from "@/context/wallet";
910
import { AppState } from "@/state/AppState";
1011

1112
function Providers({ children }: React.PropsWithChildren) {
12-
const [client] = useState(new QueryClient());
13+
const [client] = useState(() => createQueryClient());
1314
const appRootRef = useRef<HTMLDivElement>(null);
1415
const [portalContainer, setPortalContainer] = useState<HTMLElement | null>(
1516
null,

0 commit comments

Comments
 (0)