Skip to content

Commit 923736c

Browse files
fix(angular-query): support inject(QueryClient) (#8292)
* fix(angular-query): support inject(QueryClient) * ci: apply automated fixes --------- Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
1 parent 7615661 commit 923736c

File tree

22 files changed

+74
-304
lines changed

22 files changed

+74
-304
lines changed

docs/framework/angular/guides/invalidations-from-mutations.md

+5-2
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,13 @@ class TodoItemComponent {
1919
[//]: # 'Example2'
2020

2121
```ts
22-
import { injectMutation } from '@tanstack/angular-query-experimental'
22+
import {
23+
injectMutation,
24+
QueryClient,
25+
} from '@tanstack/angular-query-experimental'
2326

2427
export class TodosComponent {
25-
queryClient = injectQueryClient()
28+
queryClient = inject(QueryClient)
2629

2730
// When this mutation succeeds, invalidate any queries with the `todos` or `reminders` query key
2831
mutation = injectMutation((client) => ({

docs/framework/angular/guides/paginated-queries.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ const result = injectQuery(() => ({
7070
})
7171
export class PaginationExampleComponent {
7272
page = signal(0)
73-
#queryClient = injectQueryClient()
73+
queryClient = inject(QueryClient)
7474
7575
query = injectQuery(() => ({
7676
queryKey: ['projects', this.page()],

docs/framework/angular/guides/placeholder-query-data.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export class BlogPostComponent {
4242
this.postId.set(value)
4343
}
4444
postId = signal(0)
45-
queryClient = injectQueryClient()
45+
queryClient = inject(QueryClient)
4646

4747
result = injectQuery(() => ({
4848
queryKey: ['blogPost', this.postId()],

docs/framework/angular/guides/query-cancellation.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ export class TodosComponent {
9595
},
9696
}))
9797
98-
queryClient = injectQueryClient()
98+
queryClient = inject(QueryClient)
9999
100100
onCancel() {
101101
this.queryClient.cancelQueries(['todos'])

docs/framework/angular/guides/query-invalidation.md

+2-5
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,10 @@ replace: { 'useQuery': 'injectQuery', 'hooks': 'functions' }
88
[//]: # 'Example2'
99

1010
```ts
11-
import {
12-
injectQuery,
13-
injectQueryClient,
14-
} from '@tanstack/angular-query-experimental'
11+
import { injectQuery, QueryClient } from '@tanstack/angular-query-experimental'
1512

1613
class QueryInvalidationExample {
17-
queryClient = injectQueryClient()
14+
queryClient = inject(QueryClient)
1815

1916
invalidateQueries() {
2017
this.queryClient.invalidateQueries({ queryKey: ['todos'] })

docs/framework/angular/quick-start.md

+1-2
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ import { lastValueFrom } from 'rxjs'
5151
import {
5252
injectMutation,
5353
injectQuery,
54-
injectQueryClient,
5554
} from '@tanstack/angular-query-experimental'
5655
5756
@Component({
@@ -70,7 +69,7 @@ import {
7069
})
7170
export class TodosComponent {
7271
todoService = inject(TodoService)
73-
queryClient = injectQueryClient()
72+
queryClient = inject(QueryClient)
7473
7574
query = injectQuery(() => ({
7675
queryKey: ['todos'],

examples/angular/basic/src/app/components/post.component.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,7 @@ import {
66
inject,
77
input,
88
} from '@angular/core'
9-
import {
10-
injectQuery,
11-
injectQueryClient,
12-
} from '@tanstack/angular-query-experimental'
9+
import { QueryClient, injectQuery } from '@tanstack/angular-query-experimental'
1310
import { fromEvent, lastValueFrom, takeUntil } from 'rxjs'
1411
import { PostsService } from '../services/posts-service'
1512

@@ -38,5 +35,5 @@ export class PostComponent {
3835
},
3936
}))
4037

41-
queryClient = injectQueryClient()
38+
queryClient = inject(QueryClient)
4239
}

examples/angular/basic/src/app/components/posts.component.ts

+2-6
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,7 @@ import {
55
Output,
66
inject,
77
} from '@angular/core'
8-
import {
9-
injectQuery,
10-
injectQueryClient,
11-
} from '@tanstack/angular-query-experimental'
8+
import { QueryClient, injectQuery } from '@tanstack/angular-query-experimental'
129
import { lastValueFrom } from 'rxjs'
1310
import { PostsService } from '../services/posts-service'
1411

@@ -19,6 +16,7 @@ import { PostsService } from '../services/posts-service'
1916
templateUrl: './posts.component.html',
2017
})
2118
export class PostsComponent {
19+
queryClient = inject(QueryClient)
2220
#postsService = inject(PostsService)
2321

2422
@Output() setPostId = new EventEmitter<number>()
@@ -27,6 +25,4 @@ export class PostsComponent {
2725
queryKey: ['posts'],
2826
queryFn: () => lastValueFrom(this.#postsService.allPosts$()),
2927
}))
30-
31-
queryClient = injectQueryClient()
3228
}

examples/angular/pagination/src/app/components/example.component.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import {
77
untracked,
88
} from '@angular/core'
99
import {
10+
QueryClient,
1011
injectQuery,
11-
injectQueryClient,
1212
keepPreviousData,
1313
} from '@tanstack/angular-query-experimental'
1414
import { lastValueFrom } from 'rxjs'
@@ -21,7 +21,7 @@ import { ProjectsService } from '../services/projects.service'
2121
templateUrl: './example.component.html',
2222
})
2323
export class ExampleComponent {
24-
queryClient = injectQueryClient()
24+
queryClient = inject(QueryClient)
2525
projectsService = inject(ProjectsService)
2626
page = signal(0)
2727

examples/angular/query-options-from-a-service/src/app/components/posts.component.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
import { ChangeDetectionStrategy, Component, inject } from '@angular/core'
22
import { RouterLink } from '@angular/router'
3-
import {
4-
injectQuery,
5-
injectQueryClient,
6-
} from '@tanstack/angular-query-experimental'
3+
import { QueryClient, injectQuery } from '@tanstack/angular-query-experimental'
74
import { QueriesService } from '../services/queries-service'
85

96
@Component({
@@ -17,5 +14,5 @@ export default class PostsComponent {
1714
private queries = inject(QueriesService)
1815

1916
postsQuery = injectQuery(() => this.queries.posts())
20-
queryClient = injectQueryClient()
17+
queryClient = inject(QueryClient)
2118
}

examples/angular/router/src/app/components/posts.component.ts

+2-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
import { ChangeDetectionStrategy, Component, inject } from '@angular/core'
22
import { RouterLink } from '@angular/router'
3-
import {
4-
injectQuery,
5-
injectQueryClient,
6-
} from '@tanstack/angular-query-experimental'
3+
import { QueryClient, injectQuery } from '@tanstack/angular-query-experimental'
74
import { lastValueFrom } from 'rxjs'
85
import { PostsService } from '../services/posts-service'
96

@@ -22,5 +19,5 @@ export default class PostsComponent {
2219
queryFn: () => lastValueFrom(this.#postsService.allPosts$()),
2320
}))
2421

25-
queryClient = injectQueryClient()
22+
queryClient = inject(QueryClient)
2623
}

packages/angular-query-devtools-experimental/src/inject-devtools-panel.ts

+2-6
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,10 @@ import {
1111
} from '@angular/core'
1212
import { TanstackQueryDevtoolsPanel } from '@tanstack/query-devtools'
1313
import {
14-
injectQueryClient,
14+
QueryClient,
1515
onlineManager,
1616
} from '@tanstack/angular-query-experimental'
1717
import { isPlatformBrowser } from '@angular/common'
18-
import type { QueryClient } from '@tanstack/angular-query-experimental'
1918
import type { ElementRef } from '@angular/core'
2019
import type { DevtoolsErrorType } from '@tanstack/query-devtools'
2120

@@ -57,10 +56,7 @@ export function injectDevtoolsPanel(
5756
const destroyRef = inject(DestroyRef)
5857

5958
effect(() => {
60-
const injectedClient = injectQueryClient({
61-
optional: true,
62-
injector: currentInjector,
63-
})
59+
const injectedClient = currentInjector.get(QueryClient, null)
6460
const {
6561
client = injectedClient,
6662
errorTypes = [],

packages/angular-query-experimental/src/create-base-query.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,11 @@ import {
99
signal,
1010
untracked,
1111
} from '@angular/core'
12-
import { notifyManager } from '@tanstack/query-core'
12+
import { QueryClient, notifyManager } from '@tanstack/query-core'
1313
import { signalProxy } from './signal-proxy'
1414
import { shouldThrowError } from './util'
1515
import { lazyInit } from './util/lazy-init/lazy-init'
16-
import { injectQueryClient } from './inject-query-client'
1716
import type {
18-
QueryClient,
1917
QueryKey,
2018
QueryObserver,
2119
QueryObserverResult,
@@ -47,7 +45,7 @@ export function createBaseQuery<
4745
return lazyInit(() => {
4846
const ngZone = injector.get(NgZone)
4947
const destroyRef = injector.get(DestroyRef)
50-
const queryClient = injectQueryClient({ injector })
48+
const queryClient = injector.get(QueryClient)
5149

5250
/**
5351
* Signal that has the default options from query client applied

packages/angular-query-experimental/src/inject-is-fetching.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { DestroyRef, NgZone, inject, signal } from '@angular/core'
2-
import { notifyManager } from '@tanstack/query-core'
2+
import { QueryClient, notifyManager } from '@tanstack/query-core'
33
import { assertInjector } from './util/assert-injector/assert-injector'
4-
import { injectQueryClient } from './inject-query-client'
54
import type { QueryFilters } from '@tanstack/query-core'
65
import type { Injector, Signal } from '@angular/core'
76

@@ -20,9 +19,9 @@ export function injectIsFetching(
2019
injector?: Injector,
2120
): Signal<number> {
2221
return assertInjector(injectIsFetching, injector, () => {
23-
const queryClient = injectQueryClient()
2422
const destroyRef = inject(DestroyRef)
2523
const ngZone = inject(NgZone)
24+
const queryClient = inject(QueryClient)
2625

2726
const cache = queryClient.getQueryCache()
2827
// isFetching is the prev value initialized on mount *

packages/angular-query-experimental/src/inject-is-mutating.ts

+2-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { DestroyRef, NgZone, inject, signal } from '@angular/core'
2-
import { notifyManager } from '@tanstack/query-core'
2+
import { QueryClient, notifyManager } from '@tanstack/query-core'
33
import { assertInjector } from './util/assert-injector/assert-injector'
4-
import { injectQueryClient } from './inject-query-client'
54
import type { MutationFilters } from '@tanstack/query-core'
65
import type { Injector, Signal } from '@angular/core'
76

@@ -19,9 +18,9 @@ export function injectIsMutating(
1918
injector?: Injector,
2019
): Signal<number> {
2120
return assertInjector(injectIsMutating, injector, () => {
22-
const queryClient = injectQueryClient()
2321
const destroyRef = inject(DestroyRef)
2422
const ngZone = inject(NgZone)
23+
const queryClient = inject(QueryClient)
2524

2625
const cache = queryClient.getMutationCache()
2726
// isMutating is the prev value initialized on mount *

packages/angular-query-experimental/src/inject-mutation-state.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ import {
66
signal,
77
untracked,
88
} from '@angular/core'
9-
import { notifyManager, replaceEqualDeep } from '@tanstack/query-core'
9+
import {
10+
QueryClient,
11+
notifyManager,
12+
replaceEqualDeep,
13+
} from '@tanstack/query-core'
1014
import { assertInjector } from './util/assert-injector/assert-injector'
11-
import { injectQueryClient } from './inject-query-client'
1215
import { lazySignalInitializer } from './util/lazy-signal-initializer/lazy-signal-initializer'
1316
import type { Injector, Signal } from '@angular/core'
1417
import type {
@@ -55,8 +58,8 @@ export function injectMutationState<TResult = MutationState>(
5558
): Signal<Array<TResult>> {
5659
return assertInjector(injectMutationState, options?.injector, () => {
5760
const destroyRef = inject(DestroyRef)
58-
const queryClient = injectQueryClient()
5961
const ngZone = inject(NgZone)
62+
const queryClient = inject(QueryClient)
6063

6164
const mutationCache = queryClient.getMutationCache()
6265

packages/angular-query-experimental/src/inject-mutation.ts

+7-8
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,17 @@ import {
88
runInInjectionContext,
99
signal,
1010
} from '@angular/core'
11-
import { MutationObserver, notifyManager } from '@tanstack/query-core'
11+
import {
12+
MutationObserver,
13+
QueryClient,
14+
notifyManager,
15+
} from '@tanstack/query-core'
1216
import { assertInjector } from './util/assert-injector/assert-injector'
1317
import { signalProxy } from './signal-proxy'
14-
import { injectQueryClient } from './inject-query-client'
1518
import { noop, shouldThrowError } from './util'
1619

1720
import { lazyInit } from './util/lazy-init/lazy-init'
18-
import type {
19-
DefaultError,
20-
MutationObserverResult,
21-
QueryClient,
22-
} from '@tanstack/query-core'
21+
import type { DefaultError, MutationObserverResult } from '@tanstack/query-core'
2322
import type {
2423
CreateMutateFunction,
2524
CreateMutationOptions,
@@ -47,10 +46,10 @@ export function injectMutation<
4746
injector?: Injector,
4847
): CreateMutationResult<TData, TError, TVariables, TContext> {
4948
return assertInjector(injectMutation, injector, () => {
50-
const queryClient = injectQueryClient()
5149
const currentInjector = inject(Injector)
5250
const destroyRef = inject(DestroyRef)
5351
const ngZone = inject(NgZone)
52+
const queryClient = inject(QueryClient)
5453

5554
return lazyInit(() =>
5655
runInInjectionContext(currentInjector, () => {

packages/angular-query-experimental/src/inject-queries.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
import { QueriesObserver, notifyManager } from '@tanstack/query-core'
1+
import {
2+
QueriesObserver,
3+
QueryClient,
4+
notifyManager,
5+
} from '@tanstack/query-core'
26
import { DestroyRef, computed, effect, inject, signal } from '@angular/core'
37
import { assertInjector } from './util/assert-injector/assert-injector'
4-
import { injectQueryClient } from './inject-query-client'
58
import type { Injector, Signal } from '@angular/core'
69
import type {
710
DefaultError,
@@ -199,7 +202,7 @@ export function injectQueries<
199202
injector?: Injector,
200203
): Signal<TCombinedResult> {
201204
return assertInjector(injectQueries, injector, () => {
202-
const queryClient = injectQueryClient()
205+
const queryClient = inject(QueryClient)
203206
const destroyRef = inject(DestroyRef)
204207

205208
const defaultedQueries = computed(() => {
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,22 @@
1-
import { createNoopInjectionToken } from './util/create-injection-token/create-injection-token'
2-
import type { QueryClient } from '@tanstack/query-core'
3-
4-
const tokens = createNoopInjectionToken<QueryClient>('QueryClientToken')
1+
import { Injector, inject } from '@angular/core'
2+
import { QueryClient } from '@tanstack/query-core'
3+
import type { InjectOptions } from '@angular/core'
54

65
/**
7-
* Injects the `QueryClient` instance into the component or service.
6+
* Injects a `QueryClient` instance and allows passing a custom injector.
7+
*
8+
* You can also use `inject(QueryClient)` if you don't need to provide a custom injector.
89
*
910
* **Example**
1011
* ```ts
1112
* const queryClient = injectQueryClient();
1213
* ```
14+
* @param injectOptions - Type of the options argument to inject and optionally a custom injector.
1315
* @returns The `QueryClient` instance.
1416
* @public
1517
*/
16-
export const injectQueryClient = tokens[0]
17-
18-
/**
19-
* Usually {@link provideTanStackQuery} is used once to set up TanStack Query and the
20-
* {@link https://tanstack.com/query/latest/docs/reference/QueryClient|QueryClient}
21-
* for the entire application. You can use `provideQueryClient` to provide a
22-
* different `QueryClient` instance for a part of the application.
23-
* @public
24-
*/
25-
export const provideQueryClient = tokens[1]
26-
27-
export const QUERY_CLIENT = tokens[2]
18+
export function injectQueryClient(
19+
injectOptions: InjectOptions & { injector?: Injector } = {},
20+
) {
21+
return (injectOptions.injector ?? inject(Injector)).get(QueryClient)
22+
}

0 commit comments

Comments
 (0)