UNPKG

@tanstack/vue-query

Version:

Hooks for managing, caching and syncing asynchronous and remote data in Vue

98 lines 2.71 kB
// src/useQueries.ts import { QueriesObserver } from "@tanstack/query-core"; import { computed, getCurrentScope, onScopeDispose, readonly, shallowReadonly, shallowRef, unref, watch } from "vue-demi"; import { useQueryClient } from "./useQueryClient.js"; import { cloneDeepUnref } from "./utils.js"; function useQueries({ queries, ...options }, queryClient) { if (process.env.NODE_ENV === "development") { if (!getCurrentScope()) { console.warn( 'vue-query composable like "useQuery()" should only be used inside a "setup()" function or a running effect scope. They might otherwise lead to memory leaks.' ); } } const client = queryClient || useQueryClient(); const defaultedQueries = computed(() => { const queriesRaw = unref(queries); return queriesRaw.map((queryOptions) => { var _a; const clonedOptions = cloneDeepUnref(queryOptions); if (typeof clonedOptions.enabled === "function") { clonedOptions.enabled = queryOptions.enabled(); } const defaulted = client.defaultQueryOptions(clonedOptions); defaulted._optimisticResults = ((_a = client.isRestoring) == null ? void 0 : _a.value) ? "isRestoring" : "optimistic"; return defaulted; }); }); const observer = new QueriesObserver( client, defaultedQueries.value, options ); const getOptimisticResult = () => { const [results, getCombinedResult] = observer.getOptimisticResult( defaultedQueries.value, options.combine ); return getCombinedResult( results.map((result, index) => { return { ...result, refetch: async (...args) => { const [{ [index]: query }] = observer.getOptimisticResult( defaultedQueries.value, options.combine ); return query.refetch(...args); } }; }) ); }; const state = shallowRef(getOptimisticResult()); let unsubscribe = () => { }; if (client.isRestoring) { watch( client.isRestoring, (isRestoring) => { if (!isRestoring) { unsubscribe(); unsubscribe = observer.subscribe(() => { state.value = getOptimisticResult(); }); state.value = getOptimisticResult(); } }, { immediate: true } ); } watch(defaultedQueries, (queriesValue) => { observer.setQueries( queriesValue, options ); state.value = getOptimisticResult(); }); onScopeDispose(() => { unsubscribe(); }); return options.shallow ? shallowReadonly(state) : readonly(state); } export { useQueries }; //# sourceMappingURL=useQueries.js.map