mirror of
https://github.com/inaturalist/iNaturalistReactNative.git
synced 2026-04-20 23:10:53 -04:00
49 lines
1.8 KiB
TypeScript
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;
|