UNPKG

@tanstack/vue-query

Version:

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

87 lines 2.39 kB
// src/useQueries.ts import { QueriesObserver } from "@tanstack/query-core"; import { computed, getCurrentScope, onScopeDispose, readonly, ref, 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 composables 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( () => cloneDeepUnref(queries).map((queryOptions) => { if (typeof queryOptions.enabled === "function") { queryOptions.enabled = queryOptions.enabled(); } const defaulted = client.defaultQueryOptions(queryOptions); defaulted._optimisticResults = client.isRestoring.value ? "isRestoring" : "optimistic"; return defaulted; }) ); const observer = new QueriesObserver( client, defaultedQueries.value, options ); const [, getCombinedResult] = observer.getOptimisticResult( defaultedQueries.value ); const state = ref(getCombinedResult()); let unsubscribe = () => { }; watch( client.isRestoring, (isRestoring) => { if (!isRestoring) { unsubscribe(); unsubscribe = observer.subscribe(() => { const [, getCombinedResultRestoring] = observer.getOptimisticResult( defaultedQueries.value ); state.value = getCombinedResultRestoring(); }); const [, getCombinedResultPersisted] = observer.getOptimisticResult( defaultedQueries.value ); state.value = getCombinedResultPersisted(); } }, { immediate: true } ); watch( defaultedQueries, () => { observer.setQueries( defaultedQueries.value, options ); const [, getCombinedResultPersisted] = observer.getOptimisticResult( defaultedQueries.value ); state.value = getCombinedResultPersisted(); }, { flush: "sync" } ); onScopeDispose(() => { unsubscribe(); }); return readonly(state); } export { useQueries }; //# sourceMappingURL=useQueries.js.map