Skip to content

feat(useQueries): combine #5219

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 23 commits into from
May 15, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
1fd39ec
attempt at adding combine on observer level (doesn't work)
TkDodo Apr 1, 2023
a47b562
Merge branch 'alpha' into feature/usequeries-combine
TkDodo Apr 2, 2023
c454adf
Merge branch 'alpha' into feature/usequeries-combine
TkDodo Apr 2, 2023
e946171
feat(useQueries): combine
TkDodo Apr 2, 2023
5394172
feat(useQueries): combine
TkDodo Apr 2, 2023
00bcd2a
feat(vue-query): combine results for useQueries hook
DamianOsipiuk Apr 11, 2023
28a038d
Merge branch 'alpha' into feature/usequeries-combine
TkDodo Apr 15, 2023
9c17759
Merge branch 'alpha' into feature/usequeries-combine
TkDodo Apr 30, 2023
2e1f649
Merge branch 'alpha' into feature/usequeries-combine
TkDodo Apr 30, 2023
0a40ca1
Merge branch 'alpha' into feature/usequeries-combine
TkDodo May 1, 2023
b2d3666
Add new options to svelte-query
lachlancollins May 1, 2023
51b8d42
Add new options to solid-query
ardeora May 2, 2023
afbe137
Merge branch 'feature/usequeries-combine' of https://github.com/TanSt…
ardeora May 2, 2023
28d4ea1
Merge branch 'alpha' into feature/usequeries-combine
TkDodo May 13, 2023
8b6533c
fix: enable property tracking for useQueries
TkDodo May 13, 2023
36561f8
Merge branch 'alpha' into feature/usequeries-combine
TkDodo May 13, 2023
0a95924
fix: move property tracking to react layer
TkDodo May 13, 2023
ef14f03
chore: remove logging
TkDodo May 13, 2023
c65287a
chore: remove unnecessary type assertion
TkDodo May 13, 2023
3ba6746
Merge branch 'alpha' into feature/usequeries-combine
TkDodo May 14, 2023
ef49355
test: tests for combined data
TkDodo May 15, 2023
35149d0
docs: combine
TkDodo May 15, 2023
b318428
Merge branch 'alpha' into feature/usequeries-combine
TkDodo May 15, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat(vue-query): combine results for useQueries hook
  • Loading branch information
DamianOsipiuk committed Apr 11, 2023
commit 00bcd2a3caf1257a74bbbca22ad85ff08c671c8d
36 changes: 36 additions & 0 deletions packages/vue-query/src/__tests__/useQueries.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -217,4 +217,40 @@ describe('useQueries', () => {

expect(useQueryClient).toHaveBeenCalledTimes(0)
})

test('should combine queries', async () => {
const firstResult = 'first result'
const secondResult = 'second result'

const queryClient = new QueryClient()
const queries = [
{
queryKey: ['key41'],
queryFn: getSimpleFetcherWithReturnData(firstResult),
},
{
queryKey: ['key42'],
queryFn: getSimpleFetcherWithReturnData(secondResult),
},
]

const queriesResult = useQueries(
{
queries,
combine: (results) => {
return {
combined: true,
res: results.map((res) => res.data),
}
},
},
queryClient,
)
await flushPromises()

expect(queriesResult.value).toMatchObject({
combined: true,
res: [firstResult, secondResult],
})
})
})
46 changes: 34 additions & 12 deletions packages/vue-query/src/useQueries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { QueriesObserver } from '@tanstack/query-core'
import type {
QueriesPlaceholderDataFunction,
QueryKey,
QueriesObserverOptions,
} from '@tanstack/query-core'
import type { Ref } from 'vue-demi'
import { computed, onScopeDispose, readonly, ref, watch } from 'vue-demi'
Expand Down Expand Up @@ -145,19 +146,24 @@ export type UseQueriesResults<

type UseQueriesOptionsArg<T extends any[]> = readonly [...UseQueriesOptions<T>]

export function useQueries<T extends any[]>(
export function useQueries<
T extends any[],
TCombinedResult = UseQueriesResults<T>,
>(
{
queries,
...options
}: {
queries: MaybeRefDeep<UseQueriesOptionsArg<T>>
combine?: (result: UseQueriesResults<T>) => TCombinedResult
},
queryClient?: QueryClient,
): Readonly<Ref<UseQueriesResults<T>>> {
): Readonly<Ref<TCombinedResult>> {
const client = queryClient || useQueryClient()

const defaultedQueries = computed(() =>
cloneDeepUnref(queries).map((options) => {
const defaulted = client.defaultQueryOptions(options)
cloneDeepUnref(queries).map((queryOptions) => {
const defaulted = client.defaultQueryOptions(queryOptions)
defaulted._optimisticResults = client.isRestoring.value
? 'isRestoring'
: 'optimistic'
Expand All @@ -166,8 +172,15 @@ export function useQueries<T extends any[]>(
}),
)

const observer = new QueriesObserver(client, defaultedQueries.value)
const state = ref(observer.getCurrentResult())
const observer = new QueriesObserver<TCombinedResult>(
client,
defaultedQueries.value,
options as QueriesObserverOptions<TCombinedResult>,
)
const [, getCombinedResult] = observer.getOptimisticResult(
defaultedQueries.value,
)
const state = ref(getCombinedResult()) as Ref<TCombinedResult>

const unsubscribe = ref(() => {
// noop
Expand All @@ -178,20 +191,29 @@ export function useQueries<T extends any[]>(
(isRestoring) => {
if (!isRestoring) {
unsubscribe.value()
unsubscribe.value = observer.subscribe((result) => {
state.value.splice(0, result.length, ...result)
unsubscribe.value = observer.subscribe(() => {
const [, getCombinedResultRestoring] = observer.getOptimisticResult(
defaultedQueries.value,
)
state.value = getCombinedResultRestoring()
})
// Subscription would not fire for persisted results
state.value = observer.getOptimisticResult(defaultedQueries.value)
const [, getCombinedResultPersisted] = observer.getOptimisticResult(
defaultedQueries.value,
)
state.value = getCombinedResultPersisted()
}
},
{ immediate: true },
)

watch(
defaultedQueries,
[defaultedQueries],
() => {
observer.setQueries(defaultedQueries.value)
observer.setQueries(
defaultedQueries.value,
options as QueriesObserverOptions<TCombinedResult>,
)
state.value = observer.getCurrentResult()
},
{ deep: true },
Expand All @@ -201,5 +223,5 @@ export function useQueries<T extends any[]>(
unsubscribe.value()
})

return readonly(state) as Readonly<Ref<UseQueriesResults<T>>>
return readonly(state) as Readonly<Ref<TCombinedResult>>
}