Skip to content

Commit d0b2077

Browse files
committed
Byte-shave infinite query selectors
1 parent db14ff5 commit d0b2077

File tree

1 file changed

+50
-61
lines changed

1 file changed

+50
-61
lines changed

packages/toolkit/src/query/core/buildSelectors.ts

Lines changed: 50 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type { InternalSerializeQueryArgs } from '../defaultSerializeQueryArgs'
22
import type {
3+
EndpointDefinition,
34
EndpointDefinitions,
45
InfiniteQueryArgFrom,
56
InfiniteQueryDefinition,
@@ -206,14 +207,14 @@ export function buildSelectors<
206207
return state
207208
}
208209

209-
function buildQuerySelector(
210+
function buildAnyQuerySelector(
210211
endpointName: string,
211-
endpointDefinition: QueryDefinition<any, any, any, any>,
212+
endpointDefinition: EndpointDefinition<any, any, any, any>,
213+
combiner: <T extends { status: QueryStatus }>(
214+
substate: T,
215+
) => T & RequestStatusFlags,
212216
) {
213-
return ((queryArgs: any) => {
214-
if (queryArgs === skipToken) {
215-
return createSelector(selectSkippedQuery, withRequestFlags)
216-
}
217+
return (queryArgs: any) => {
217218
const serializedArgs = serializeQueryArgs({
218219
queryArgs,
219220
endpointDefinition,
@@ -222,76 +223,64 @@ export function buildSelectors<
222223
const selectQuerySubstate = (state: RootState) =>
223224
selectInternalState(state)?.queries?.[serializedArgs] ??
224225
defaultQuerySubState
226+
const finalSelectQuerySubState =
227+
queryArgs === skipToken ? selectSkippedQuery : selectQuerySubstate
228+
229+
return createSelector(finalSelectQuerySubState, combiner)
230+
}
231+
}
225232

226-
return createSelector(selectQuerySubstate, withRequestFlags)
227-
}) as QueryResultSelectorFactory<any, RootState>
233+
function buildQuerySelector(
234+
endpointName: string,
235+
endpointDefinition: QueryDefinition<any, any, any, any>,
236+
) {
237+
return buildAnyQuerySelector(
238+
endpointName,
239+
endpointDefinition,
240+
withRequestFlags,
241+
) as QueryResultSelectorFactory<any, RootState>
228242
}
229243

230-
// Selector will merge all existing entries in the cache and return the result
231-
// selector currently is just a clone of Query though
232244
function buildInfiniteQuerySelector(
233245
endpointName: string,
234246
endpointDefinition: InfiniteQueryDefinition<any, any, any, any, any>,
235247
) {
236-
return ((queryArgs: any) => {
237-
const serializedArgs = serializeQueryArgs({
238-
queryArgs,
239-
endpointDefinition,
240-
endpointName,
241-
})
242-
const selectQuerySubstate = (state: RootState) =>
243-
selectInternalState(state)?.queries?.[serializedArgs] ??
244-
defaultQuerySubState
245-
const finalSelectQuerySubState =
246-
queryArgs === skipToken ? selectSkippedQuery : selectQuerySubstate
247-
248-
const { infiniteQueryOptions } = endpointDefinition
249-
250-
function withInfiniteQueryResultFlags<T extends { status: QueryStatus }>(
251-
substate: T,
252-
): T & RequestStatusFlags & InfiniteQueryResultFlags {
253-
const infiniteSubstate = substate as InfiniteQuerySubState<any>
254-
const fetchDirection = infiniteSubstate.direction
255-
const stateWithRequestFlags = {
256-
...infiniteSubstate,
257-
...getRequestStatusFlags(substate.status),
258-
}
259-
260-
const { isLoading, isError } = stateWithRequestFlags
261-
262-
const isFetchNextPageError = isError && fetchDirection === 'forward'
263-
const isFetchingNextPage = isLoading && fetchDirection === 'forward'
248+
const { infiniteQueryOptions } = endpointDefinition
249+
250+
function withInfiniteQueryResultFlags<T extends { status: QueryStatus }>(
251+
substate: T,
252+
): T & RequestStatusFlags & InfiniteQueryResultFlags {
253+
const stateWithRequestFlags = {
254+
...(substate as InfiniteQuerySubState<any>),
255+
...getRequestStatusFlags(substate.status),
256+
}
264257

265-
const isFetchPreviousPageError =
266-
isError && fetchDirection === 'backward'
267-
const isFetchingPreviousPage =
268-
isLoading && fetchDirection === 'backward'
258+
const { isLoading, isError, direction } = stateWithRequestFlags
259+
const isForward = direction === 'forward'
260+
const isBackward = direction === 'backward'
269261

270-
const hasNextPage = getHasNextPage(
262+
return {
263+
...stateWithRequestFlags,
264+
hasNextPage: getHasNextPage(
271265
infiniteQueryOptions,
272266
stateWithRequestFlags.data,
273-
)
274-
const hasPreviousPage = getHasPreviousPage(
267+
),
268+
hasPreviousPage: getHasPreviousPage(
275269
infiniteQueryOptions,
276270
stateWithRequestFlags.data,
277-
)
278-
279-
return {
280-
...stateWithRequestFlags,
281-
hasNextPage,
282-
hasPreviousPage,
283-
isFetchingNextPage,
284-
isFetchingPreviousPage,
285-
isFetchNextPageError,
286-
isFetchPreviousPageError,
287-
}
271+
),
272+
isFetchingNextPage: isLoading && isForward,
273+
isFetchingPreviousPage: isLoading && isBackward,
274+
isFetchNextPageError: isError && isForward,
275+
isFetchPreviousPageError: isError && isBackward,
288276
}
277+
}
289278

290-
return createSelector(
291-
finalSelectQuerySubState,
292-
withInfiniteQueryResultFlags,
293-
)
294-
}) as InfiniteQueryResultSelectorFactory<any, RootState>
279+
return buildAnyQuerySelector(
280+
endpointName,
281+
endpointDefinition,
282+
withInfiniteQueryResultFlags,
283+
) as unknown as InfiniteQueryResultSelectorFactory<any, RootState>
295284
}
296285

297286
function buildMutationSelector() {

0 commit comments

Comments
 (0)