Skip to content

Commit 46f99f0

Browse files
Mini-ghostTkDodoDamianOsipiuk
authored
feat(vue-query): let composables accepts enabled as a getter function (#6018)
Co-authored-by: Dominik Dorfmeister <office@dorfmeister.cc> Co-authored-by: Damian Osipiuk <osipiukd+git@gmail.com>
1 parent 9d5ea55 commit 46f99f0

File tree

7 files changed

+82
-2
lines changed

7 files changed

+82
-2
lines changed

packages/vue-query/src/__tests__/useQueries.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,4 +253,27 @@ describe('useQueries', () => {
253253
res: [firstResult, secondResult],
254254
})
255255
})
256+
257+
test('should be `enabled` to accept getter function', async () => {
258+
const fetchFn = vi.fn()
259+
const checked = ref(false)
260+
261+
useQueries({
262+
queries: [
263+
{
264+
queryKey: ['enabled'],
265+
queryFn: fetchFn,
266+
enabled: () => checked.value,
267+
},
268+
],
269+
})
270+
271+
expect(fetchFn).not.toHaveBeenCalled()
272+
273+
checked.value = true
274+
275+
await flushPromises()
276+
277+
expect(fetchFn).toHaveBeenCalled()
278+
})
256279
})

packages/vue-query/src/__tests__/useQuery.test.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,25 @@ describe('useQuery', () => {
269269
)
270270
})
271271

272+
test('should be `enabled` to accept getter function', async () => {
273+
const fetchFn = vi.fn()
274+
const checked = ref(false)
275+
276+
useQuery({
277+
queryKey: ['enabled'],
278+
queryFn: fetchFn,
279+
enabled: () => checked.value,
280+
})
281+
282+
expect(fetchFn).not.toHaveBeenCalled()
283+
284+
checked.value = true
285+
286+
await flushPromises()
287+
288+
expect(fetchFn).toHaveBeenCalled()
289+
})
290+
272291
describe('throwOnError', () => {
273292
test('should evaluate throwOnError when query is expected to throw', async () => {
274293
const boundaryFn = vi.fn()

packages/vue-query/src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ type UnwrapLeaf =
1414

1515
export type MaybeRef<T> = Ref<T> | T
1616

17+
export type MaybeRefOrGetter<T> = MaybeRef<T> | (() => T)
18+
1719
export type MaybeRefDeep<T> = MaybeRef<
1820
T extends Function
1921
? T

packages/vue-query/src/useBaseQuery.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,13 +84,19 @@ export function useBaseQuery<
8484
const client = queryClient || useQueryClient()
8585

8686
const defaultedOptions = computed(() => {
87+
const clonedOptions = cloneDeepUnref(options as any)
88+
89+
if (typeof clonedOptions.enabled === 'function') {
90+
clonedOptions.enabled = clonedOptions.enabled()
91+
}
92+
8793
const defaulted: DefaultedQueryObserverOptions<
8894
TQueryFnData,
8995
TError,
9096
TData,
9197
TQueryData,
9298
TQueryKey
93-
> = client.defaultQueryOptions(cloneDeepUnref(options as any))
99+
> = client.defaultQueryOptions(clonedOptions)
94100

95101
defaulted._optimisticResults = client.isRestoring.value
96102
? 'isRestoring'

packages/vue-query/src/useInfiniteQuery.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ import type {
1212

1313
import type { UseBaseQueryReturnType } from './useBaseQuery'
1414

15-
import type { DeepUnwrapRef, DistributiveOmit, MaybeRefDeep } from './types'
15+
import type {
16+
DeepUnwrapRef,
17+
DistributiveOmit,
18+
MaybeRefDeep,
19+
MaybeRefOrGetter,
20+
} from './types'
1621
import type { QueryClient } from './queryClient'
1722

1823
export type UseInfiniteQueryOptions<
@@ -39,6 +44,16 @@ export type UseInfiniteQueryOptions<
3944
DeepUnwrapRef<TQueryKey>,
4045
TPageParam
4146
>[Property]
47+
: Property extends 'enabled'
48+
? MaybeRefOrGetter<
49+
InfiniteQueryObserverOptions<
50+
TQueryFnData,
51+
TError,
52+
TData,
53+
TQueryData,
54+
TQueryKey
55+
>[Property]
56+
>
4257
: MaybeRefDeep<
4358
WithRequired<
4459
InfiniteQueryObserverOptions<

packages/vue-query/src/useQueries.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,10 @@ export function useQueries<
186186

187187
const defaultedQueries = computed(() =>
188188
cloneDeepUnref(queries).map((queryOptions) => {
189+
if (typeof queryOptions.enabled === 'function') {
190+
queryOptions.enabled = queryOptions.enabled()
191+
}
192+
189193
const defaulted = client.defaultQueryOptions(queryOptions)
190194
defaulted._optimisticResults = client.isRestoring.value
191195
? 'isRestoring'

packages/vue-query/src/useQuery.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import type {
1515
DistributiveOmit,
1616
MaybeRef,
1717
MaybeRefDeep,
18+
MaybeRefOrGetter,
1819
} from './types'
1920
import type { QueryClient } from './queryClient'
2021

@@ -39,6 +40,16 @@ export type UseQueryOptions<
3940
TQueryData,
4041
DeepUnwrapRef<TQueryKey>
4142
>[Property]
43+
: Property extends 'enabled'
44+
? MaybeRefOrGetter<
45+
QueryObserverOptions<
46+
TQueryFnData,
47+
TError,
48+
TData,
49+
TQueryData,
50+
TQueryKey
51+
>[Property]
52+
>
4253
: MaybeRefDeep<
4354
WithRequired<
4455
QueryObserverOptions<

0 commit comments

Comments
 (0)