Skip to content

Commit a029984

Browse files
feat(vue-query): enabled accepts getter function (#6004)
* feat(vue-query): `useBaseQuery` accepts `enabled` as a getter function * feat(vue-query): `useQueries` accepts `enabled` as a getter function --------- Co-authored-by: Damian Osipiuk <[email protected]>
1 parent bd04c70 commit a029984

File tree

5 files changed

+84
-5
lines changed

5 files changed

+84
-5
lines changed

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { onScopeDispose, reactive } from 'vue-demi'
1+
import { onScopeDispose, reactive, ref } from 'vue-demi'
22

33
import { useQueries } from '../useQueries'
44
import { useQueryClient } from '../useQueryClient'
@@ -231,4 +231,28 @@ describe('useQueries', () => {
231231

232232
expect(useQueryClient).toHaveBeenCalledTimes(0)
233233
})
234+
235+
test('should be `enabled` to accept getter function', async () => {
236+
const fetchFn = jest.fn()
237+
238+
const checked = ref(false)
239+
240+
useQueries({
241+
queries: [
242+
{
243+
queryKey: ['enabled'],
244+
queryFn: fetchFn,
245+
enabled: () => checked.value,
246+
},
247+
],
248+
})
249+
250+
expect(fetchFn).not.toHaveBeenCalled()
251+
252+
checked.value = true
253+
254+
await flushPromises()
255+
256+
expect(fetchFn).toHaveBeenCalled()
257+
})
234258
})

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

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

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

packages/vue-query/src/types.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ export type MaybeRefDeep<T> = MaybeRef<
3232

3333
export type MaybeRef<T> = Ref<T> | T
3434

35+
export type MaybeRefOrGetter<T> = MaybeRef<T> | (() => T)
36+
3537
export type DeepUnwrapRef<T> = T extends UnwrapLeaf
3638
? T
3739
: T extends Ref<infer U>
@@ -70,6 +72,16 @@ export type VueQueryObserverOptions<
7072
TQueryData,
7173
DeepUnwrapRef<TQueryKey>
7274
>[Property]
75+
: Property extends 'enabled'
76+
? MaybeRefOrGetter<
77+
QueryObserverOptions<
78+
TQueryFnData,
79+
TError,
80+
TData,
81+
TQueryData,
82+
TQueryKey
83+
>[Property]
84+
>
7385
: MaybeRef<
7486
QueryObserverOptions<
7587
TQueryFnData,
@@ -104,6 +116,16 @@ export type VueInfiniteQueryObserverOptions<
104116
TQueryData,
105117
DeepUnwrapRef<TQueryKey>
106118
>[Property]
119+
: Property extends 'enabled'
120+
? MaybeRefOrGetter<
121+
QueryObserverOptions<
122+
TQueryFnData,
123+
TError,
124+
TData,
125+
TQueryData,
126+
TQueryKey
127+
>[Property]
128+
>
107129
: MaybeRef<
108130
InfiniteQueryObserverOptions<
109131
TQueryFnData,

packages/vue-query/src/useBaseQuery.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,13 @@ export function parseQueryArgs<
226226
options = { ...plainArg2, queryKey: plainArg1 }
227227
}
228228

229-
return cloneDeepUnref(options) as WithQueryClientKey<
229+
const clondedOptions = cloneDeepUnref(options)
230+
231+
if (typeof clondedOptions.enabled === 'function') {
232+
clondedOptions.enabled = clondedOptions.enabled()
233+
}
234+
235+
return clondedOptions as WithQueryClientKey<
230236
QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>
231237
>
232238
}

packages/vue-query/src/useQueries.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,17 @@ export function useQueries<T extends any[]>({
148148
}
149149
}
150150

151-
const unreffedQueries = computed(
152-
() => cloneDeepUnref(queries) as UseQueriesOptionsArg<T>,
153-
)
151+
const unreffedQueries = computed(() => {
152+
const clonedQueries = cloneDeepUnref(queries)
153+
154+
;(clonedQueries as any[]).map((query) => {
155+
if (typeof query.enabled === 'function') {
156+
query.enabled = query.enabled()
157+
}
158+
})
159+
160+
return clonedQueries as UseQueriesOptionsArg<T>
161+
})
154162

155163
const queryClientKey = unreffedQueries.value[0]?.queryClientKey
156164
const optionsQueryClient = unreffedQueries.value[0]?.queryClient as

0 commit comments

Comments
 (0)