1
1
import { QueryClient , QueryClientProvider } from "react-query" ;
2
- import type { FC , ReactNode } from "react" ;
2
+ import { type FC , type ReactNode , useEffect , useState } from "react" ;
3
3
import { HelmetProvider } from "react-helmet-async" ;
4
4
import { AppRouter } from "./AppRouter" ;
5
5
import { ThemeProvider } from "./contexts/ThemeProvider" ;
6
6
import { AuthProvider } from "./contexts/AuthProvider/AuthProvider" ;
7
7
import { ErrorBoundary } from "./components/ErrorBoundary/ErrorBoundary" ;
8
8
import { GlobalSnackbar } from "./components/GlobalSnackbar/GlobalSnackbar" ;
9
9
import "./theme/globalFonts" ;
10
+ import { ReactQueryDevtools } from "@tanstack/react-query-devtools" ;
10
11
11
12
const defaultQueryClient = new QueryClient ( {
12
13
defaultOptions : {
@@ -22,10 +23,25 @@ interface AppProvidersProps {
22
23
queryClient ?: QueryClient ;
23
24
}
24
25
26
+ // extending the global window interface so we can conditionally
27
+ // show our react query devtools
28
+ declare global {
29
+ interface Window {
30
+ toggleDevtools : ( ) => void ;
31
+ }
32
+ }
33
+
25
34
export const AppProviders : FC < AppProvidersProps > = ( {
26
35
children,
27
36
queryClient = defaultQueryClient ,
28
37
} ) => {
38
+ // https://tanstack.com/query/v4/docs/react/devtools
39
+ const [ showDevtools , setShowDevtools ] = useState ( false ) ;
40
+ useEffect ( ( ) => {
41
+ window . toggleDevtools = ( ) => setShowDevtools ( ( old ) => ! old ) ;
42
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- no dependencies needed here
43
+ } , [ ] ) ;
44
+
29
45
return (
30
46
< HelmetProvider >
31
47
< QueryClientProvider client = { queryClient } >
@@ -35,6 +51,7 @@ export const AppProviders: FC<AppProvidersProps> = ({
35
51
< GlobalSnackbar />
36
52
</ ThemeProvider >
37
53
</ AuthProvider >
54
+ { showDevtools && < ReactQueryDevtools initialIsOpen = { showDevtools } /> }
38
55
</ QueryClientProvider >
39
56
</ HelmetProvider >
40
57
) ;
0 commit comments