| 83 | > = UseQueryResult<TData, TError> & PaginationResultInfo; |
| 84 | |
| 85 | export function usePaginatedQuery< |
| 86 | TQueryFnData extends PaginatedData = PaginatedData, |
| 87 | TQueryPayload = never, |
| 88 | TError = unknown, |
| 89 | TData extends PaginatedData = TQueryFnData, |
| 90 | TQueryKey extends QueryKey = QueryKey, |
| 91 | >( |
| 92 | options: UsePaginatedQueryOptions< |
| 93 | TQueryFnData, |
| 94 | TQueryPayload, |
| 95 | TError, |
| 96 | TData, |
| 97 | TQueryKey |
| 98 | >, |
| 99 | ): UsePaginatedQueryResult<TData, TError> { |
| 100 | const { |
| 101 | queryKey, |
| 102 | queryPayload, |
| 103 | onInvalidPageChange, |
| 104 | searchParams: outerSearchParams, |
| 105 | queryFn: outerQueryFn, |
| 106 | prefetch = true, |
| 107 | staleTime = 60 * 1000, // One minute |
| 108 | ...extraOptions |
| 109 | } = options; |
| 110 | |
| 111 | const [innerSearchParams, setSearchParams] = useSearchParams(); |
| 112 | const searchParams = outerSearchParams ?? innerSearchParams; |
| 113 | |
| 114 | const limit = DEFAULT_RECORDS_PER_PAGE; |
| 115 | const currentPage = parsePage(searchParams); |
| 116 | const currentPageOffset = (currentPage - 1) * limit; |
| 117 | |
| 118 | type Options = UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>; |
| 119 | const getQueryOptionsFromPage = (pageNumber: number): Options => { |
| 120 | const pageParams: QueryPageParams = { |
| 121 | pageNumber, |
| 122 | limit, |
| 123 | offset: (pageNumber - 1) * limit, |
| 124 | searchParams: getParamsWithoutPage(searchParams), |
| 125 | }; |
| 126 | |
| 127 | const payload = queryPayload?.(pageParams) as RuntimePayload<TQueryPayload>; |
| 128 | return { |
| 129 | staleTime, |
| 130 | queryKey: queryKey({ ...pageParams, payload }), |
| 131 | queryFn: (context: QueryFunctionContext<TQueryKey>) => { |
| 132 | return outerQueryFn({ ...context, ...pageParams, payload }); |
| 133 | }, |
| 134 | }; |
| 135 | }; |
| 136 | |
| 137 | // Not using infinite query right now because that requires a fair bit of list |
| 138 | // virtualization as the lists get bigger (especially for the audit logs). |
| 139 | // Keeping initial implementation simple. |
| 140 | const query = useQuery<TQueryFnData, TError, TData, TQueryKey>({ |
| 141 | ...extraOptions, |
| 142 | ...getQueryOptionsFromPage(currentPage), |