import { type InfiniteData, type UseInfiniteQueryOptions, type UseInfiniteQueryResult, useInfiniteQuery, } from '@tanstack/react-query' import type { TypedDocumentString } from '@/generated/graphql/graphql' import { execute } from './execute' import { getQueryKeyFromDocument } from './getQueryKeyFromDocument' /** * @public */ export const useGraphqlInfiniteQuery = < TQueryFnData, // biome-ignore lint/suspicious/noExplicitAny: TODO(dani) type GraphQL variables properly TVariables extends Record | undefined = undefined, TPageParam extends string | undefined | number = undefined, >( query: TypedDocumentString, getVariables: (pageParam: TPageParam) => TVariables, options: Omit< UseInfiniteQueryOptions< TQueryFnData, // TQueryFnData Error, // TError InfiniteData // TData >, 'queryKey' | 'queryFn' > & { /** Required by React Query v5 */ initialPageParam: TPageParam }, ): UseInfiniteQueryResult, Error> => { const queryKey = [getQueryKeyFromDocument(query)] as const return useInfiniteQuery< TQueryFnData, // TQueryFnData Error, // TError InfiniteData // TData (pages + pageParams) >({ queryKey, queryFn: async ({ pageParam }) => execute( query, getVariables(pageParam as TPageParam), ), ...options, }) }