@tanstack/angular-query-experimental
Version:
Signals for managing, caching and syncing asynchronous and remote data in Angular
75 lines (74 loc) • 2.6 kB
JavaScript
import { inject, NgZone, computed, signal, effect, untracked, VERSION } from "@angular/core";
import { QueryClient, notifyManager, shouldThrowError } from "@tanstack/query-core";
import { signalProxy } from "./signal-proxy.mjs";
import { injectIsRestoring } from "./inject-is-restoring.mjs";
function createBaseQuery(optionsFn, Observer) {
const ngZone = inject(NgZone);
const queryClient = inject(QueryClient);
const isRestoring = injectIsRestoring();
const defaultedOptionsSignal = computed(() => {
const defaultedOptions = queryClient.defaultQueryOptions(optionsFn());
defaultedOptions._optimisticResults = isRestoring() ? "isRestoring" : "optimistic";
return defaultedOptions;
});
const observerSignal = (() => {
let instance = null;
return computed(() => {
return instance || (instance = new Observer(queryClient, defaultedOptionsSignal()));
});
})();
const optimisticResultSignal = computed(
() => observerSignal().getOptimisticResult(defaultedOptionsSignal())
);
const resultFromSubscriberSignal = signal(null);
effect(
(onCleanup) => {
const observer = observerSignal();
const defaultedOptions = defaultedOptionsSignal();
untracked(() => {
observer.setOptions(defaultedOptions);
});
onCleanup(() => {
ngZone.run(() => resultFromSubscriberSignal.set(null));
});
},
{
// Set allowSignalWrites to support Angular < v19
// Set to undefined to avoid warning on newer versions
allowSignalWrites: VERSION.major < "19" || void 0
}
);
effect((onCleanup) => {
const observer = observerSignal();
const unsubscribe = isRestoring() ? () => void 0 : untracked(
() => ngZone.runOutsideAngular(
() => observer.subscribe(
notifyManager.batchCalls((state) => {
ngZone.run(() => {
if (state.isError && !state.isFetching && shouldThrowError(observer.options.throwOnError, [
state.error,
observer.getCurrentQuery()
])) {
ngZone.onError.emit(state.error);
throw state.error;
}
resultFromSubscriberSignal.set(state);
});
})
)
)
);
onCleanup(unsubscribe);
});
return signalProxy(
computed(() => {
const subscriberResult = resultFromSubscriberSignal();
const optimisticResult = optimisticResultSignal();
return subscriberResult ?? optimisticResult;
})
);
}
export {
createBaseQuery
};
//# sourceMappingURL=create-base-query.mjs.map