From 1298e1bb237e9f773f78e7204110ffb71b84cae6 Mon Sep 17 00:00:00 2001 From: TkDodo Date: Fri, 11 Jul 2025 12:51:27 +0200 Subject: [PATCH 1/2] feat(core): QueryObserver returns isEnabled flag --- docs/framework/react/reference/useQuery.md | 3 +++ .../src/__tests__/queryObserver.test.tsx | 23 +++++++++++++++++++ packages/query-core/src/queryObserver.ts | 1 + packages/query-core/src/types.ts | 4 ++++ .../src/__tests__/useInfiniteQuery.test.tsx | 2 ++ .../src/__tests__/useQuery.test.tsx | 5 ++++ 6 files changed, 38 insertions(+) diff --git a/docs/framework/react/reference/useQuery.md b/docs/framework/react/reference/useQuery.md index 5bda1e9e53..d4f1554e0e 100644 --- a/docs/framework/react/reference/useQuery.md +++ b/docs/framework/react/reference/useQuery.md @@ -26,6 +26,7 @@ const { isRefetching, isStale, isSuccess, + isEnabled, promise, refetch, status, @@ -234,6 +235,8 @@ const { - `isInitialLoading: boolean` - **deprecated** - An alias for `isLoading`, will be removed in the next major version. +- `isEnabled: boolean` + - Is `true` if this query observer is enabled, `false` otherwise. - `failureCount: number` - The failure count for the query. - Incremented every time the query fails. diff --git a/packages/query-core/src/__tests__/queryObserver.test.tsx b/packages/query-core/src/__tests__/queryObserver.test.tsx index 6c88ecdaed..c7b18eba58 100644 --- a/packages/query-core/src/__tests__/queryObserver.test.tsx +++ b/packages/query-core/src/__tests__/queryObserver.test.tsx @@ -1405,4 +1405,27 @@ describe('queryObserver', () => { const result = observer.getCurrentResult() expect(result.fetchStatus).toBe('idle') }) + + test('should return isEnabled depending on enabled being resolved', () => { + const key = queryKey() + const observer = new QueryObserver(queryClient, { + queryKey: key, + queryFn: () => 'data', + enabled: () => false, + }) + + const result = observer.getCurrentResult() + expect(result.isEnabled).toBe(false) + }) + + test('should return isEnabled as true per default', () => { + const key = queryKey() + const observer = new QueryObserver(queryClient, { + queryKey: key, + queryFn: () => 'data', + }) + + const result = observer.getCurrentResult() + expect(result.isEnabled).toBe(true) + }) }) diff --git a/packages/query-core/src/queryObserver.ts b/packages/query-core/src/queryObserver.ts index f2b961eb27..ac0a3e079a 100644 --- a/packages/query-core/src/queryObserver.ts +++ b/packages/query-core/src/queryObserver.ts @@ -576,6 +576,7 @@ export class QueryObserver< isStale: isStale(query, options), refetch: this.refetch, promise: this.#currentThenable, + isEnabled: resolveEnabled(options.enabled, query) !== false, } const nextResult = result as QueryObserverResult diff --git a/packages/query-core/src/types.ts b/packages/query-core/src/types.ts index e4ed081539..df6ea8c173 100644 --- a/packages/query-core/src/types.ts +++ b/packages/query-core/src/types.ts @@ -717,6 +717,10 @@ export interface QueryObserverBaseResult< * - `true` if the query has received a response with no errors and is ready to display its data. */ isSuccess: boolean + /** + * `true` if this observer is enabled, `false` otherwise. + */ + isEnabled: boolean /** * A function to manually refetch the query. */ diff --git a/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx b/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx index 26de8f3335..b15a9b2edf 100644 --- a/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx +++ b/packages/react-query/src/__tests__/useInfiniteQuery.test.tsx @@ -114,6 +114,7 @@ describe('useInfiniteQuery', () => { isRefetching: false, isStale: true, isSuccess: false, + isEnabled: true, refetch: expect.any(Function), status: 'pending', fetchStatus: 'fetching', @@ -150,6 +151,7 @@ describe('useInfiniteQuery', () => { isRefetching: false, isStale: true, isSuccess: true, + isEnabled: true, refetch: expect.any(Function), status: 'success', fetchStatus: 'idle', diff --git a/packages/react-query/src/__tests__/useQuery.test.tsx b/packages/react-query/src/__tests__/useQuery.test.tsx index 893abb03b6..6ae1bf6f99 100644 --- a/packages/react-query/src/__tests__/useQuery.test.tsx +++ b/packages/react-query/src/__tests__/useQuery.test.tsx @@ -121,6 +121,7 @@ describe('useQuery', () => { isRefetching: false, isStale: true, isSuccess: false, + isEnabled: true, refetch: expect.any(Function), status: 'pending', fetchStatus: 'fetching', @@ -149,6 +150,7 @@ describe('useQuery', () => { isRefetching: false, isStale: true, isSuccess: true, + isEnabled: true, refetch: expect.any(Function), status: 'success', fetchStatus: 'idle', @@ -210,6 +212,7 @@ describe('useQuery', () => { isRefetching: false, isStale: true, isSuccess: false, + isEnabled: true, refetch: expect.any(Function), status: 'pending', fetchStatus: 'fetching', @@ -238,6 +241,7 @@ describe('useQuery', () => { isRefetching: false, isStale: true, isSuccess: false, + isEnabled: true, refetch: expect.any(Function), status: 'pending', fetchStatus: 'fetching', @@ -266,6 +270,7 @@ describe('useQuery', () => { isRefetching: false, isStale: true, isSuccess: false, + isEnabled: true, refetch: expect.any(Function), status: 'error', fetchStatus: 'idle', From d89fea02a661596abb62fe4fab671d0f83cfe551 Mon Sep 17 00:00:00 2001 From: TkDodo Date: Fri, 11 Jul 2025 13:07:56 +0200 Subject: [PATCH 2/2] test: solid and svelte --- packages/solid-query/src/__tests__/useInfiniteQuery.test.tsx | 2 ++ packages/solid-query/src/__tests__/useQuery.test.tsx | 5 +++++ .../tests/createInfiniteQuery/createInfiniteQuery.test.ts | 2 ++ 3 files changed, 9 insertions(+) diff --git a/packages/solid-query/src/__tests__/useInfiniteQuery.test.tsx b/packages/solid-query/src/__tests__/useInfiniteQuery.test.tsx index 402e4bc22a..ef830be729 100644 --- a/packages/solid-query/src/__tests__/useInfiniteQuery.test.tsx +++ b/packages/solid-query/src/__tests__/useInfiniteQuery.test.tsx @@ -112,6 +112,7 @@ describe('useInfiniteQuery', () => { isRefetching: false, isStale: true, isSuccess: false, + isEnabled: true, refetch: expect.any(Function), status: 'pending', fetchStatus: 'fetching', @@ -148,6 +149,7 @@ describe('useInfiniteQuery', () => { isRefetching: false, isStale: true, isSuccess: true, + isEnabled: true, refetch: expect.any(Function), status: 'success', fetchStatus: 'idle', diff --git a/packages/solid-query/src/__tests__/useQuery.test.tsx b/packages/solid-query/src/__tests__/useQuery.test.tsx index 7e3027afcc..799a8e240e 100644 --- a/packages/solid-query/src/__tests__/useQuery.test.tsx +++ b/packages/solid-query/src/__tests__/useQuery.test.tsx @@ -301,6 +301,7 @@ describe('useQuery', () => { isRefetching: false, isStale: true, isSuccess: false, + isEnabled: true, refetch: expect.any(Function), status: 'pending', fetchStatus: 'fetching', @@ -329,6 +330,7 @@ describe('useQuery', () => { isRefetching: false, isStale: true, isSuccess: true, + isEnabled: true, refetch: expect.any(Function), status: 'success', fetchStatus: 'idle', @@ -392,6 +394,7 @@ describe('useQuery', () => { isRefetching: false, isStale: true, isSuccess: false, + isEnabled: true, refetch: expect.any(Function), status: 'pending', fetchStatus: 'fetching', @@ -420,6 +423,7 @@ describe('useQuery', () => { isRefetching: false, isStale: true, isSuccess: false, + isEnabled: true, refetch: expect.any(Function), status: 'pending', fetchStatus: 'fetching', @@ -448,6 +452,7 @@ describe('useQuery', () => { isRefetching: false, isStale: true, isSuccess: false, + isEnabled: true, refetch: expect.any(Function), status: 'error', fetchStatus: 'idle', diff --git a/packages/svelte-query/tests/createInfiniteQuery/createInfiniteQuery.test.ts b/packages/svelte-query/tests/createInfiniteQuery/createInfiniteQuery.test.ts index d80bc9c706..6fd3addf44 100644 --- a/packages/svelte-query/tests/createInfiniteQuery/createInfiniteQuery.test.ts +++ b/packages/svelte-query/tests/createInfiniteQuery/createInfiniteQuery.test.ts @@ -54,6 +54,7 @@ describe('createInfiniteQuery', () => { isRefetching: false, isStale: true, isSuccess: false, + isEnabled: true, refetch: expect.any(Function), status: 'pending', fetchStatus: 'fetching', @@ -90,6 +91,7 @@ describe('createInfiniteQuery', () => { isRefetching: false, isStale: true, isSuccess: true, + isEnabled: true, refetch: expect.any(Function), status: 'success', fetchStatus: 'idle',