Jestem w trakcie przepisywania istniejącej apki na Tanstack Query. Właściwie wszystko hulało do momentu kiedy chciałem zastosować centralną obsługę błędów. Struktura plików (trochę to długie, ale chcę rozwiać wszystkie możliwe wątpliwości) jest taka:
główny index
ReactDOM.render(
<AppProvider>
<App />
</AppProvider>,
document.getElementById("root")
);
App.tsx
const App = () => {
return (
<main>
<Routes>
<Route path={ROUTES.LANDING} element={<LandingPage />} />
<Route path={ROUTES.SEARCH} element={<SearchPage />} />
{location?.state?.results && (
<Route path={"/" + location.state.results} element={<WeatherInformationsPage />} />
)}
<Route path={ROUTES.NOPAGE} element={<NoPage />} />
</Routes>
</main>
);
};
AppProvider.tsx
const AppProvider: FC = ({ children }) => {
// const queryClient = useQueryClient();
return (
<Provider store={store}>
<QueryClientProvider client={useQueryClient()}>
<StyledEngineProvider injectFirst>
<ThemeProvider theme={theme}>
<SnackbarProvider
maxSnack={3}
anchorOrigin={{
vertical: "bottom",
horizontal: "center",
}}
>
<PlaceContextProvider>
<CheckSupportForLocalStorage>
<CheckSupportForGeolocation>
<SetBackground>
<Router>{children}</Router>
</SetBackground>
</CheckSupportForGeolocation>
</CheckSupportForLocalStorage>
</PlaceContextProvider>
</SnackbarProvider>
</ThemeProvider>
</StyledEngineProvider>
</QueryClientProvider>
</Provider>
);
};
No i na końcu ten najważniejszy useQueryClient()
. Uwaga, to jest postać docelowa, oczekiwana, ale nie działająca - w tej postaci on nie działa o czym poniżej
const useQueryClient = () => {
const { showErrorMessage } = useDispatchAction();
const queryErrorHandler = (err: unknown): void => {
const axiosError = err as AxiosError;
showErrorMessage(axiosError)
};
const defaultQueryClientOptions = {
queries: {
onError: queryErrorHandler,
retry: false,
cacheTime: 1.1 * (60 * 1000),
refetchOnMount: false,
refetchOnWindowFocus: false,
staleTime: 1 * (60 * 1000),
refetchInterval: 1 * (60 * 1000),
},
};
return new QueryClient({
defaultOptions: defaultQueryClientOptions,
});
};
Błąd w konsoli pokazuje się kiedy w powyższym umieszczam linię
const { showErrorMessage } = useDispatchAction();
I biorąc pod uwagę strukturę AppProvider
a nie rozumiem dlaczego - przecież jest to objęte Provider
em (przedtem próbowałem trochę inaczej i wtedy faktycznie nie było).