@tanstack/vue-query
Version:
Hooks for managing, caching and syncing asynchronous and remote data in Vue
87 lines • 2.39 kB
JavaScript
// 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