diff --git a/packages/toolkit/src/query/core/buildThunks.ts b/packages/toolkit/src/query/core/buildThunks.ts index 20e4184dc6..b9c5187f79 100644 --- a/packages/toolkit/src/query/core/buildThunks.ts +++ b/packages/toolkit/src/query/core/buildThunks.ts @@ -919,6 +919,14 @@ In the case of an unhandled error, no tags will be "provided" or "invalidated".` return true } + if ( + isQueryDefinition(endpointDefinition) && + endpointDefinition?.skipCondition && + endpointDefinition?.skipCondition(state) + ) { + return false + } + if ( isQueryDefinition(endpointDefinition) && endpointDefinition?.forceRefetch?.({ diff --git a/packages/toolkit/src/query/endpointDefinitions.ts b/packages/toolkit/src/query/endpointDefinitions.ts index f881e78d88..c11a2f522d 100644 --- a/packages/toolkit/src/query/endpointDefinitions.ts +++ b/packages/toolkit/src/query/endpointDefinitions.ts @@ -612,6 +612,18 @@ export interface QueryExtraOptions< */ invalidatesTags?: never + /** + * Can be provided to skip the query if the condition is met. + * + * It's the equivalent of the `skip` option on the query hook but for the endpoint definition. + * + * @example + * ```ts + * skipCondition: (state) => state.user.isLoggedIn === false + * ``` + */ + skipCondition?: (state: RootState) => boolean + /** * Can be provided to return a custom cache key value based on the query arguments. * diff --git a/packages/toolkit/src/query/react/buildHooks.ts b/packages/toolkit/src/query/react/buildHooks.ts index f51d85a195..d29d9b5eb2 100644 --- a/packages/toolkit/src/query/react/buildHooks.ts +++ b/packages/toolkit/src/query/react/buildHooks.ts @@ -64,7 +64,10 @@ import type { ReactHooksModuleOptions } from './module' import { useStableQueryArgs } from './useSerializedStableValue' import { useShallowStableValue } from './useShallowStableValue' import type { InfiniteQueryDirection } from '../core/apiState' -import { isInfiniteQueryDefinition } from '../endpointDefinitions' +import { + isInfiniteQueryDefinition, + isQueryDefinition, +} from '../endpointDefinitions' import type { StartInfiniteQueryActionCreator } from '../core/buildInitiate' // Copy-pasted from React-Redux @@ -1992,9 +1995,17 @@ export function buildHooks({ }, useQuery(arg, options) { const querySubscriptionResults = useQuerySubscription(arg, options) + const store = useStore>() + + const endpointDefinition = context.endpointDefinitions[endpointName] + const shouldSkipFromCondition = + isQueryDefinition(endpointDefinition) && + endpointDefinition?.skipCondition && + endpointDefinition?.skipCondition(store.getState()) + const queryStateResults = useQueryState(arg, { selectFromResult: - arg === skipToken || options?.skip + arg === skipToken || options?.skip || shouldSkipFromCondition ? undefined : noPendingQueryStateSelector, ...options,