import { InfiniteData, useInfiniteQuery } from '@tanstack/react-query' import { components } from 'api-types' import { projectKeys } from './keys' import { get, handleError } from '@/data/fetchers' import { useProfile } from '@/lib/profile' import type { ResponseError, UseCustomInfiniteQueryOptions } from '@/types' const DEFAULT_LIMIT = 100 interface GetProjectsInfiniteVariables { limit?: number sort?: 'name_asc' | 'name_desc' | 'created_asc' | 'created_desc' search?: string page?: number } export type ProjectInfiniteResponse = components['schemas']['ListProjectsPaginatedResponse_Output'] export type ProjectInfoInfinite = ProjectInfiniteResponse['projects'][number] async function getProjects( { limit = DEFAULT_LIMIT, page = 0, sort = 'name_asc', search: _search = '', }: GetProjectsInfiniteVariables, signal?: AbortSignal, headers?: Record ) { const offset = page * limit const search = _search.length === 0 ? undefined : _search const { data, error } = await get('/platform/projects', { // @ts-ignore [Joshen] API type issue for Version 2 endpoints params: { query: { limit, offset, sort, search } }, signal, headers: { ...headers, Version: '2' }, }) if (error) handleError(error) return data as unknown as components['schemas']['ListProjectsPaginatedResponse_Output'] } export type ProjectsInfiniteData = Awaited> export type ProjectsInfiniteError = ResponseError export const useProjectsInfiniteQuery = ( { limit = DEFAULT_LIMIT, sort = 'name_asc', search }: GetProjectsInfiniteVariables, { enabled = true, ...options }: UseCustomInfiniteQueryOptions< ProjectsInfiniteData, ProjectsInfiniteError, InfiniteData, readonly unknown[], number > = {} ) => { const { profile } = useProfile() return useInfiniteQuery({ queryKey: projectKeys.infiniteList({ limit, sort, search }), queryFn: ({ signal, pageParam }) => getProjects({ limit, page: pageParam, sort, search }, signal), enabled: enabled && profile !== undefined, staleTime: 30 * 60 * 1000, // 30 minutes initialPageParam: 0, getNextPageParam(lastPage, pages) { const page = pages.length const currentTotalCount = page * limit // @ts-ignore [Joshen] API type issue for Version 2 endpoints const totalCount = lastPage?.pagination?.count if (totalCount === undefined || currentTotalCount >= totalCount) return undefined return page }, ...options, }) }