UNPKG

@tanstack/angular-query-experimental

Version:

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

52 lines (51 loc) 1.99 kB
import { assertInInjectionContext, inject, Injector, DestroyRef, NgZone, computed, signal } from "@angular/core"; import { QueryClient, notifyManager, replaceEqualDeep } from "@tanstack/query-core"; function getResult(mutationCache, options) { return mutationCache.findAll(options.filters).map( (mutation) => options.select ? options.select(mutation) : mutation.state ); } function injectMutationState(injectMutationStateFn = () => ({}), options) { !(options == null ? void 0 : options.injector) && assertInInjectionContext(injectMutationState); const injector = (options == null ? void 0 : options.injector) ?? inject(Injector); const destroyRef = injector.get(DestroyRef); const ngZone = injector.get(NgZone); const queryClient = injector.get(QueryClient); const mutationCache = queryClient.getMutationCache(); const resultFromOptionsSignal = computed(() => { return [ getResult(mutationCache, injectMutationStateFn()), performance.now() ]; }); const resultFromSubscriberSignal = signal( null ); const effectiveResultSignal = computed(() => { const optionsResult = resultFromOptionsSignal(); const subscriberResult = resultFromSubscriberSignal(); return subscriberResult && subscriberResult[1] > optionsResult[1] ? subscriberResult[0] : optionsResult[0]; }); const unsubscribe = ngZone.runOutsideAngular( () => mutationCache.subscribe( notifyManager.batchCalls(() => { const [lastResult] = effectiveResultSignal(); const nextResult = replaceEqualDeep( lastResult, getResult(mutationCache, injectMutationStateFn()) ); if (lastResult !== nextResult) { ngZone.run(() => { resultFromSubscriberSignal.set([nextResult, performance.now()]); }); } }) ) ); destroyRef.onDestroy(unsubscribe); return effectiveResultSignal; } export { injectMutationState }; //# sourceMappingURL=inject-mutation-state.mjs.map