@tanstack/angular-query-experimental
Version:
Signals for managing, caching and syncing asynchronous and remote data in Angular
50 lines (49 loc) • 1.66 kB
JavaScript
import { QueryClient, QueriesObserver, notifyManager } from "@tanstack/query-core";
import { assertInInjectionContext, runInInjectionContext, inject, Injector, DestroyRef, NgZone, computed, effect, signal } from "@angular/core";
import { injectIsRestoring } from "./inject-is-restoring.mjs";
function injectQueries({
queries,
...options
}, 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 defaultedQueries = computed(() => {
return queries().map((opts) => {
const defaultedOptions = queryClient.defaultQueryOptions(opts);
defaultedOptions._optimisticResults = isRestoring() ? "isRestoring" : "optimistic";
return defaultedOptions;
});
});
const observer = new QueriesObserver(
queryClient,
defaultedQueries(),
options
);
effect(() => {
observer.setQueries(
defaultedQueries(),
options
);
});
const [, getCombinedResult] = observer.getOptimisticResult(
defaultedQueries(),
options.combine
);
const result = signal(getCombinedResult());
effect(() => {
const unsubscribe = isRestoring() ? () => void 0 : ngZone.runOutsideAngular(
() => observer.subscribe(notifyManager.batchCalls(result.set))
);
destroyRef.onDestroy(unsubscribe);
});
return result;
});
}
export {
injectQueries
};
//# sourceMappingURL=inject-queries.mjs.map