TanStack Query setup for offline caching

Code snippet to easily setup offline caching for TanStack Query in a React Native app.

import { persister } from "@/lib/mmkv";
import { QueryClient, onlineManager } from "@tanstack/react-query";
import { PersistQueryClientProvider } from "@tanstack/react-query-persist-client";
import { useEffect, type PropsWithChildren } from "react";
import { useReactQueryDevTools } from "@dev-plugins/react-query";
import NetInfo from "@react-native-community/netinfo";

const queryClient = new QueryClient({
  defaultOptions: {
    queries: {
      staleTime: Number.POSITIVE_INFINITY,
      gcTime: Number.POSITIVE_INFINITY,
    },
  },
});

export function QueryProvider({ children }: PropsWithChildren) {
  useReactQueryDevTools(queryClient);

  useEffect(() => {
    return NetInfo.addEventListener((state) => {
      const status = !!state.isConnected;
      onlineManager.setOnline(status);
    });
  }, []);

  return (
    <PersistQueryClientProvider
      client={queryClient}
      onSuccess={() =>
        queryClient.resumePausedMutations().then(() => queryClient.invalidateQueries())
      }
      persistOptions={{ persister, maxAge: Number.POSITIVE_INFINITY }}
    >
      {children}
    </PersistQueryClientProvider>
  );
}