import type { InfiniteData, QueryKey, UseInfiniteQueryResult, UseInfiniteQueryOptions } from '@tanstack/react-query'; import { useInfiniteQuery } from '@tanstack/react-query'; import type { PaginatedResourceName, ResourceError, ResourcePayload } from './resources'; import useApiFetch from './useApiFetch'; import type { Params as ApiFetchParams } from './useApiFetch'; import { getResourceKey } from './useApiQuery'; type TQueryData = ResourcePayload; type TError = ResourceError; type TPageParam = ApiFetchParams['queryParams'] | null; export interface Params { resourceName: R; // eslint-disable-next-line max-len queryOptions?: Omit, TError, InfiniteData>, TQueryData, QueryKey, TPageParam>, 'queryKey' | 'queryFn' | 'getNextPageParam' | 'initialPageParam'>; pathParams?: ApiFetchParams['pathParams']; } type ReturnType = UseInfiniteQueryResult>, ResourceError>; export default function useApiInfiniteQuery({ resourceName, queryOptions, pathParams, }: Params): ReturnType { const apiFetch = useApiFetch(); return useInfiniteQuery, TError, InfiniteData>, QueryKey, TPageParam>({ queryKey: getResourceKey(resourceName, { pathParams }), queryFn: (context) => { const queryParams = 'pageParam' in context ? (context.pageParam || undefined) : undefined; return apiFetch(resourceName, { pathParams, queryParams }) as Promise>; }, initialPageParam: null, getNextPageParam: (lastPage) => { return lastPage.next_page_params as TPageParam; }, ...queryOptions, }); }