UNPKG

@tanstack/angular-query-experimental

Version:

Signals for managing, caching and syncing asynchronous and remote data in Angular

83 lines (82 loc) 2.95 kB
import { QueryClient, QueriesObserver, notifyManager } from "@tanstack/query-core"; import { assertInInjectionContext, runInInjectionContext, inject, Injector, DestroyRef, NgZone, computed, effect, signal, untracked } from "@angular/core"; import { signalProxy } from "./signal-proxy.mjs"; import { injectIsRestoring } from "./inject-is-restoring.mjs"; function injectQueries(optionsFn, injector) { !injector && assertInInjectionContext(injectQueries); return runInInjectionContext(injector ?? inject(Injector), () => { const destroyRef = inject(DestroyRef); const ngZone = inject(NgZone); const queryClient = inject(QueryClient); const isRestoring = injectIsRestoring(); const optionsSignal = computed(() => { return optionsFn(); }); const defaultedQueries = computed(() => { return optionsSignal().queries.map((opts) => { const defaultedOptions = queryClient.defaultQueryOptions( opts ); defaultedOptions._optimisticResults = isRestoring() ? "isRestoring" : "optimistic"; return defaultedOptions; }); }); const observerSignal = (() => { let instance = null; return computed(() => { return instance || (instance = new QueriesObserver( queryClient, defaultedQueries(), optionsSignal() )); }); })(); const optimisticResultSignal = computed( () => observerSignal().getOptimisticResult( defaultedQueries(), optionsSignal().combine ) ); effect(() => { observerSignal().setQueries( defaultedQueries(), optionsSignal() ); }); const optimisticCombinedResultSignal = computed(() => { const [_optimisticResult, getCombinedResult, trackResult] = optimisticResultSignal(); return getCombinedResult(trackResult()); }); const resultFromSubscriberSignal = signal(null); effect(() => { const observer = observerSignal(); const [_optimisticResult, getCombinedResult] = optimisticResultSignal(); untracked(() => { const unsubscribe = isRestoring() ? () => void 0 : ngZone.runOutsideAngular( () => observer.subscribe( notifyManager.batchCalls((state) => { resultFromSubscriberSignal.set(getCombinedResult(state)); }) ) ); destroyRef.onDestroy(unsubscribe); }); }); const resultSignal = computed(() => { const subscriberResult = resultFromSubscriberSignal(); const optimisticResult = optimisticCombinedResultSignal(); return subscriberResult ?? optimisticResult; }); return computed(() => { const result = resultSignal(); const { combine } = optionsSignal(); return combine ? result : result.map( (query) => signalProxy(signal(query)) ); }); }); } export { injectQueries }; //# sourceMappingURL=inject-queries.mjs.map