Skip to content

Commit 5d12a32

Browse files
authored
refactor(angular-query): remove private assertInjector util (#9012)
1 parent 572e2a5 commit 5d12a32

10 files changed

+263
-402
lines changed

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

+9-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import { InfiniteQueryObserver } from '@tanstack/query-core'
2+
import {
3+
Injector,
4+
assertInInjectionContext,
5+
inject,
6+
runInInjectionContext,
7+
} from '@angular/core'
28
import { createBaseQuery } from './create-base-query'
3-
import { assertInjector } from './util/assert-injector/assert-injector'
49
import type {
510
DefaultError,
611
InfiniteData,
@@ -16,7 +21,6 @@ import type {
1621
DefinedInitialDataInfiniteOptions,
1722
UndefinedInitialDataInfiniteOptions,
1823
} from './infinite-query-options'
19-
import type { Injector } from '@angular/core'
2024

2125
export interface InjectInfiniteQueryOptions {
2226
/**
@@ -115,14 +119,12 @@ export function injectInfiniteQuery(
115119
injectInfiniteQueryFn: () => CreateInfiniteQueryOptions,
116120
options?: InjectInfiniteQueryOptions,
117121
) {
118-
return assertInjector(injectInfiniteQuery, options?.injector, () =>
122+
!options?.injector && assertInInjectionContext(injectInfiniteQuery)
123+
const injector = options?.injector ?? inject(Injector)
124+
return runInInjectionContext(injector, () =>
119125
createBaseQuery(
120126
injectInfiniteQueryFn,
121127
InfiniteQueryObserver as typeof QueryObserver,
122128
),
123129
)
124130
}
125-
126-
export interface InjectInfiniteQueryOptions {
127-
injector?: Injector
128-
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1-
import { DestroyRef, NgZone, inject, signal } from '@angular/core'
1+
import {
2+
DestroyRef,
3+
Injector,
4+
NgZone,
5+
assertInInjectionContext,
6+
inject,
7+
signal,
8+
} from '@angular/core'
29
import { QueryClient, notifyManager } from '@tanstack/query-core'
3-
import { assertInjector } from './util/assert-injector/assert-injector'
410
import type { QueryFilters } from '@tanstack/query-core'
5-
import type { Injector, Signal } from '@angular/core'
11+
import type { Signal } from '@angular/core'
612

713
export interface InjectIsFetchingOptions {
814
/**
@@ -27,34 +33,34 @@ export function injectIsFetching(
2733
filters?: QueryFilters,
2834
options?: InjectIsFetchingOptions,
2935
): Signal<number> {
30-
return assertInjector(injectIsFetching, options?.injector, () => {
31-
const destroyRef = inject(DestroyRef)
32-
const ngZone = inject(NgZone)
33-
const queryClient = inject(QueryClient)
36+
!options?.injector && assertInInjectionContext(injectIsFetching)
37+
const injector = options?.injector ?? inject(Injector)
38+
const destroyRef = injector.get(DestroyRef)
39+
const ngZone = injector.get(NgZone)
40+
const queryClient = injector.get(QueryClient)
3441

35-
const cache = queryClient.getQueryCache()
36-
// isFetching is the prev value initialized on mount *
37-
let isFetching = queryClient.isFetching(filters)
42+
const cache = queryClient.getQueryCache()
43+
// isFetching is the prev value initialized on mount *
44+
let isFetching = queryClient.isFetching(filters)
3845

39-
const result = signal(isFetching)
46+
const result = signal(isFetching)
4047

41-
const unsubscribe = ngZone.runOutsideAngular(() =>
42-
cache.subscribe(
43-
notifyManager.batchCalls(() => {
44-
const newIsFetching = queryClient.isFetching(filters)
45-
if (isFetching !== newIsFetching) {
46-
// * and update with each change
47-
isFetching = newIsFetching
48-
ngZone.run(() => {
49-
result.set(isFetching)
50-
})
51-
}
52-
}),
53-
),
54-
)
48+
const unsubscribe = ngZone.runOutsideAngular(() =>
49+
cache.subscribe(
50+
notifyManager.batchCalls(() => {
51+
const newIsFetching = queryClient.isFetching(filters)
52+
if (isFetching !== newIsFetching) {
53+
// * and update with each change
54+
isFetching = newIsFetching
55+
ngZone.run(() => {
56+
result.set(isFetching)
57+
})
58+
}
59+
}),
60+
),
61+
)
5562

56-
destroyRef.onDestroy(unsubscribe)
63+
destroyRef.onDestroy(unsubscribe)
5764

58-
return result
59-
})
65+
return result
6066
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1-
import { DestroyRef, NgZone, inject, signal } from '@angular/core'
1+
import {
2+
DestroyRef,
3+
Injector,
4+
NgZone,
5+
assertInInjectionContext,
6+
inject,
7+
signal,
8+
} from '@angular/core'
29
import { QueryClient, notifyManager } from '@tanstack/query-core'
3-
import { assertInjector } from './util/assert-injector/assert-injector'
410
import type { MutationFilters } from '@tanstack/query-core'
5-
import type { Injector, Signal } from '@angular/core'
11+
import type { Signal } from '@angular/core'
612

713
export interface InjectIsMutatingOptions {
814
/**
@@ -26,34 +32,34 @@ export function injectIsMutating(
2632
filters?: MutationFilters,
2733
options?: InjectIsMutatingOptions,
2834
): Signal<number> {
29-
return assertInjector(injectIsMutating, options?.injector, () => {
30-
const destroyRef = inject(DestroyRef)
31-
const ngZone = inject(NgZone)
32-
const queryClient = inject(QueryClient)
35+
!options?.injector && assertInInjectionContext(injectIsMutating)
36+
const injector = options?.injector ?? inject(Injector)
37+
const destroyRef = injector.get(DestroyRef)
38+
const ngZone = injector.get(NgZone)
39+
const queryClient = injector.get(QueryClient)
3340

34-
const cache = queryClient.getMutationCache()
35-
// isMutating is the prev value initialized on mount *
36-
let isMutating = queryClient.isMutating(filters)
41+
const cache = queryClient.getMutationCache()
42+
// isMutating is the prev value initialized on mount *
43+
let isMutating = queryClient.isMutating(filters)
3744

38-
const result = signal(isMutating)
45+
const result = signal(isMutating)
3946

40-
const unsubscribe = ngZone.runOutsideAngular(() =>
41-
cache.subscribe(
42-
notifyManager.batchCalls(() => {
43-
const newIsMutating = queryClient.isMutating(filters)
44-
if (isMutating !== newIsMutating) {
45-
// * and update with each change
46-
isMutating = newIsMutating
47-
ngZone.run(() => {
48-
result.set(isMutating)
49-
})
50-
}
51-
}),
52-
),
53-
)
47+
const unsubscribe = ngZone.runOutsideAngular(() =>
48+
cache.subscribe(
49+
notifyManager.batchCalls(() => {
50+
const newIsMutating = queryClient.isMutating(filters)
51+
if (isMutating !== newIsMutating) {
52+
// * and update with each change
53+
isMutating = newIsMutating
54+
ngZone.run(() => {
55+
result.set(isMutating)
56+
})
57+
}
58+
}),
59+
),
60+
)
5461

55-
destroyRef.onDestroy(unsubscribe)
62+
destroyRef.onDestroy(unsubscribe)
5663

57-
return result
58-
})
64+
return result
5965
}

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

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
} from '@angular/core'
88
import type { Provider, Signal } from '@angular/core'
99

10-
const IsRestoring = new InjectionToken<Signal<boolean>>('IsRestoring')
10+
const IS_RESTORING = new InjectionToken<Signal<boolean>>('')
1111

1212
/**
1313
* The `Injector` in which to create the isRestoring signal.
@@ -30,7 +30,7 @@ export function injectIsRestoring(
3030
!options?.injector && assertInInjectionContext(injectIsRestoring)
3131
const injector = options?.injector ?? inject(Injector)
3232
return injector.get(
33-
IsRestoring,
33+
IS_RESTORING,
3434
computed(() => false),
3535
{ optional: true },
3636
)
@@ -44,7 +44,7 @@ export function injectIsRestoring(
4444
*/
4545
export function provideIsRestoring(isRestoring: Signal<boolean>): Provider {
4646
return {
47-
provide: IsRestoring,
47+
provide: IS_RESTORING,
4848
useValue: isRestoring,
4949
}
5050
}
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
1-
import { DestroyRef, NgZone, computed, inject, signal } from '@angular/core'
1+
import {
2+
DestroyRef,
3+
Injector,
4+
NgZone,
5+
assertInInjectionContext,
6+
computed,
7+
inject,
8+
signal,
9+
} from '@angular/core'
210
import {
311
QueryClient,
412
notifyManager,
513
replaceEqualDeep,
614
} from '@tanstack/query-core'
7-
import { assertInjector } from './util/assert-injector/assert-injector'
8-
import type { Injector, Signal } from '@angular/core'
15+
import type { Signal } from '@angular/core'
916
import type {
1017
Mutation,
1118
MutationCache,
@@ -58,62 +65,61 @@ export function injectMutationState<TResult = MutationState>(
5865
injectMutationStateFn: () => MutationStateOptions<TResult> = () => ({}),
5966
options?: InjectMutationStateOptions,
6067
): Signal<Array<TResult>> {
61-
return assertInjector(injectMutationState, options?.injector, () => {
62-
const destroyRef = inject(DestroyRef)
63-
const ngZone = inject(NgZone)
64-
const queryClient = inject(QueryClient)
65-
66-
const mutationCache = queryClient.getMutationCache()
68+
!options?.injector && assertInInjectionContext(injectMutationState)
69+
const injector = options?.injector ?? inject(Injector)
70+
const destroyRef = injector.get(DestroyRef)
71+
const ngZone = injector.get(NgZone)
72+
const queryClient = injector.get(QueryClient)
73+
const mutationCache = queryClient.getMutationCache()
6774

68-
/**
69-
* Computed signal that gets result from mutation cache based on passed options
70-
* First element is the result, second element is the time when the result was set
71-
*/
72-
const resultFromOptionsSignal = computed(() => {
73-
return [
74-
getResult(mutationCache, injectMutationStateFn()),
75-
performance.now(),
76-
] as const
77-
})
75+
/**
76+
* Computed signal that gets result from mutation cache based on passed options
77+
* First element is the result, second element is the time when the result was set
78+
*/
79+
const resultFromOptionsSignal = computed(() => {
80+
return [
81+
getResult(mutationCache, injectMutationStateFn()),
82+
performance.now(),
83+
] as const
84+
})
7885

79-
/**
80-
* Signal that contains result set by subscriber
81-
* First element is the result, second element is the time when the result was set
82-
*/
83-
const resultFromSubscriberSignal = signal<[Array<TResult>, number] | null>(
84-
null,
85-
)
86+
/**
87+
* Signal that contains result set by subscriber
88+
* First element is the result, second element is the time when the result was set
89+
*/
90+
const resultFromSubscriberSignal = signal<[Array<TResult>, number] | null>(
91+
null,
92+
)
8693

87-
/**
88-
* Returns the last result by either subscriber or options
89-
*/
90-
const effectiveResultSignal = computed(() => {
91-
const optionsResult = resultFromOptionsSignal()
92-
const subscriberResult = resultFromSubscriberSignal()
93-
return subscriberResult && subscriberResult[1] > optionsResult[1]
94-
? subscriberResult[0]
95-
: optionsResult[0]
96-
})
94+
/**
95+
* Returns the last result by either subscriber or options
96+
*/
97+
const effectiveResultSignal = computed(() => {
98+
const optionsResult = resultFromOptionsSignal()
99+
const subscriberResult = resultFromSubscriberSignal()
100+
return subscriberResult && subscriberResult[1] > optionsResult[1]
101+
? subscriberResult[0]
102+
: optionsResult[0]
103+
})
97104

98-
const unsubscribe = ngZone.runOutsideAngular(() =>
99-
mutationCache.subscribe(
100-
notifyManager.batchCalls(() => {
101-
const [lastResult] = effectiveResultSignal()
102-
const nextResult = replaceEqualDeep(
103-
lastResult,
104-
getResult(mutationCache, injectMutationStateFn()),
105-
)
106-
if (lastResult !== nextResult) {
107-
ngZone.run(() => {
108-
resultFromSubscriberSignal.set([nextResult, performance.now()])
109-
})
110-
}
111-
}),
112-
),
113-
)
105+
const unsubscribe = ngZone.runOutsideAngular(() =>
106+
mutationCache.subscribe(
107+
notifyManager.batchCalls(() => {
108+
const [lastResult] = effectiveResultSignal()
109+
const nextResult = replaceEqualDeep(
110+
lastResult,
111+
getResult(mutationCache, injectMutationStateFn()),
112+
)
113+
if (lastResult !== nextResult) {
114+
ngZone.run(() => {
115+
resultFromSubscriberSignal.set([nextResult, performance.now()])
116+
})
117+
}
118+
}),
119+
),
120+
)
114121

115-
destroyRef.onDestroy(unsubscribe)
122+
destroyRef.onDestroy(unsubscribe)
116123

117-
return effectiveResultSignal
118-
})
124+
return effectiveResultSignal
119125
}

0 commit comments

Comments
 (0)