@pinia/colada-plugin-auto-refetch
Version:
Automatically refetch queries when they become stale in Pinia Colada
56 lines • 1.83 kB
JavaScript
// src/index.ts
import { toValue } from "vue";
var REFETCH_TIMEOUT_KEY = Symbol();
function PiniaColadaAutoRefetch(options = {}) {
const { autoRefetch = false } = options;
return ({ queryCache }) => {
if (typeof document === "undefined") return;
function scheduleRefetch(entry, options2) {
if (!entry.active) return;
clearTimeout(entry.ext[REFETCH_TIMEOUT_KEY]);
const timeout = setTimeout(() => {
if (options2) {
const entry2 = queryCache.getEntries({
key: toValue(options2.key)
})?.[0];
if (entry2 && entry2.active) {
queryCache.refresh(entry2).catch(console.error);
}
}
}, options2.staleTime);
entry.ext[REFETCH_TIMEOUT_KEY] = timeout;
}
queryCache.$onAction(({ name, args, after }) => {
function shouldScheduleRefetch(options2) {
const queryEnabled = toValue(options2.autoRefetch) ?? autoRefetch;
const staleTime = options2.staleTime;
return Boolean(queryEnabled && staleTime);
}
if (name === "ensure") {
const [options2] = args;
after((entry) => {
if (!shouldScheduleRefetch(options2)) return;
scheduleRefetch(entry, options2);
});
}
if (name === "fetch") {
const [entry] = args;
clearTimeout(entry.ext[REFETCH_TIMEOUT_KEY]);
after(async () => {
if (!entry.options) return;
if (!shouldScheduleRefetch(entry.options)) return;
scheduleRefetch(entry, entry.options);
});
}
if (name === "remove") {
const [entry] = args;
clearTimeout(entry.ext[REFETCH_TIMEOUT_KEY]);
}
});
};
}
export {
PiniaColadaAutoRefetch,
REFETCH_TIMEOUT_KEY as _REFETCH_TIMEOUT_KEY
};
//# sourceMappingURL=index.js.map