@tanstack/angular-query-experimental
Version:
Signals for managing, caching and syncing asynchronous and remote data in Angular
52 lines (51 loc) • 1.99 kB
JavaScript
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