import type { UseQueryOptions } from '@tanstack/react-query'; import { useQueries } from '@tanstack/react-query'; import type { ResourceError, ResourceName, ResourcePayload } from './resources'; import useApiFetch from './useApiFetch'; import type { Params as ApiQueryParams } from './useApiQuery'; import { getResourceKey } from './useApiQuery'; export interface ReturnType { isLoading: boolean; isPlaceholderData: boolean; isError: boolean; isSuccess: boolean; data: Array> | undefined; error: ResourceError | null | undefined; } export default function useApiQueries( resource: R, params: Array>, queryOptions: Partial, ResourceError, Array>>, 'queries'>>, ) { const apiFetch = useApiFetch(); return useQueries, ResourceError>>, ReturnType>({ queries: params.map(({ pathParams, queryParams, queryOptions, fetchParams, logError, chain }) => { return { queryKey: getResourceKey(resource, { pathParams, queryParams, chainId: chain?.id }), queryFn: async({ signal }) => { return apiFetch(resource, { pathParams, queryParams, logError, chain, fetchParams: { ...fetchParams, signal } }) as Promise>; }, ...queryOptions, }; }), combine: (results) => { const isError = results.some((result) => result.isError); const isSuccess = results.every((result) => result.isSuccess); return { isLoading: results.some((result) => result.isLoading), isPlaceholderData: results.some((result) => result.isPlaceholderData), isError, isSuccess, data: isSuccess ? results.map((result) => result.data).flat() as Array> : undefined, error: isError ? results.find((result) => result.error)?.error : undefined, } satisfies ReturnType; }, ...queryOptions, }); }