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