Files
iNaturalistReactNative/src/sharedHooks/useAuthenticatedInfiniteQuery.ts
2025-12-22 18:26:38 -08:00

49 lines
1.8 KiB
TypeScript

import { useRoute } from "@react-navigation/native";
import { useInfiniteQuery } from "@tanstack/react-query";
import { getJWT } from "components/LoginSignUp/AuthenticationService";
import i18n from "i18next";
import { handleRetryDelay, reactQueryRetry } from "sharedHelpers/logging";
import { useCurrentUser } from "sharedHooks";
// Should work like React Query's useInfiniteQuery with our custom reactQueryRetry
// and authentication
const useAuthenticatedInfiniteQuery = (
queryKey: string[],
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
queryFunction: Function,
queryOptions: object = {},
): object => {
const route = useRoute( );
const currentUser = useCurrentUser( );
// Use locale in case there is no user session
const locale = i18n?.language ?? "en";
return useInfiniteQuery( {
queryKey: [...queryKey, queryOptions.allowAnonymousJWT, currentUser],
queryFn: async params => {
if ( !currentUser ) {
params.locale = locale;
}
// logger.info( queryKey, "queryKey in useAuthenticatedInfiniteQuery" );
// Note, getJWT() takes care of fetching a new token if the existing
// one is expired. We *could* store the token in state with useState if
// fetching from RNSInfo becomes a performance issue
const apiToken = await getJWT( queryOptions.allowAnonymousJWT );
const options = {
api_token: apiToken,
};
return queryFunction( params, options );
},
retry: ( failureCount, error ) => reactQueryRetry( failureCount, error, {
queryKey,
routeName: route?.name,
routeParams: route?.params,
} ),
retryDelay: ( failureCount, error ) => handleRetryDelay( failureCount, error ),
...queryOptions,
} );
};
export default useAuthenticatedInfiniteQuery;