177 lines
4.1 KiB
JavaScript
177 lines
4.1 KiB
JavaScript
import { onMounted } from "vue";
|
|
import { watch } from "vue";
|
|
import { onScopeDispose } from "vue";
|
|
import { ref } from "vue";
|
|
import { apiCacheKey } from "~/lib/auth.js";
|
|
import { apiCacheVersion } from "~/lib/auth.js";
|
|
import { useApi } from "~/lib/auth.js";
|
|
import { writeApiCache } from "~/lib/auth.js";
|
|
import { readApiCache } from "~/lib/auth.js";
|
|
import { clearApiCache } from "~/lib/auth.js";
|
|
function u(u, d = {}) {
|
|
let f = useApi(),
|
|
p =
|
|
d.identity ??
|
|
(typeof f.identity == `function` ? () => f.identity() : void 0),
|
|
m = d.retainOnRefreshError !== !1,
|
|
h = ref([]),
|
|
g = ref(0),
|
|
_ = ref(!1),
|
|
v = ref(``),
|
|
y = ref(!1),
|
|
b = ref(1),
|
|
x = ref(d.limit ?? 10),
|
|
S = 0,
|
|
C = ``,
|
|
w = !0,
|
|
T = !1,
|
|
E = null;
|
|
function D() {
|
|
(S++,
|
|
(h.value = []),
|
|
(g.value = 0),
|
|
(_.value = !1),
|
|
(v.value = ``),
|
|
(y.value = !1),
|
|
(C = ``),
|
|
(E = null),
|
|
(w = !1));
|
|
}
|
|
(p &&
|
|
watch(
|
|
p,
|
|
() => {
|
|
(clearApiCache(), D());
|
|
},
|
|
{
|
|
flush: `sync`,
|
|
},
|
|
),
|
|
onScopeDispose(() => {
|
|
((T = !0), S++, (E = null));
|
|
}));
|
|
function O(e) {
|
|
if (d.rowKey) return d.rowKey(e);
|
|
if (
|
|
e &&
|
|
typeof e == `object` &&
|
|
`id` in e &&
|
|
(typeof e.id == `string` || typeof e.id == `number`)
|
|
)
|
|
return e.id;
|
|
}
|
|
function k() {
|
|
if (T) return Promise.resolve();
|
|
let e,
|
|
t,
|
|
n = p?.();
|
|
try {
|
|
((e = {
|
|
page: b.value,
|
|
limit: x.value,
|
|
...(d.params?.() ?? {}),
|
|
}),
|
|
(t = apiCacheKey(
|
|
u,
|
|
e,
|
|
typeof d.snapshotKey == `function` ? d.snapshotKey() : d.snapshotKey,
|
|
)));
|
|
} catch (e) {
|
|
return (
|
|
D(),
|
|
(v.value = e instanceof Error ? e.message : `查询条件无效`),
|
|
Promise.resolve()
|
|
);
|
|
}
|
|
if (E?.query === t && E.identity === n) return E.promise;
|
|
let r = ++S,
|
|
o = () => !T && r === S && (!p || p() === n);
|
|
((_.value = !0), (v.value = ``));
|
|
let l = y.value && t === C,
|
|
k = p ? readApiCache(n, t) : void 0,
|
|
A = apiCacheVersion();
|
|
(l || ((h.value = []), (g.value = 0), (y.value = !1)),
|
|
w &&
|
|
k &&
|
|
((h.value = k.list),
|
|
(g.value = k.count),
|
|
(y.value = !0),
|
|
(C = t),
|
|
(l = !0)),
|
|
(w = !1));
|
|
let j = (async () => {
|
|
try {
|
|
let r = d.loader ? await d.loader(e) : await f.get(u, e);
|
|
if (!o()) return;
|
|
let i = new Map(
|
|
h.value.flatMap((e) => {
|
|
let t = O(e);
|
|
return t === void 0 ? [] : [[t, e]];
|
|
}),
|
|
);
|
|
((h.value = (r.list ?? []).map((e) => {
|
|
let t = O(e),
|
|
n = t === void 0 ? void 0 : i.get(t);
|
|
if (!n || typeof n != `object` || typeof e != `object` || !e)
|
|
return e;
|
|
let r = n;
|
|
for (let t of Object.keys(r))
|
|
Object.prototype.hasOwnProperty.call(e, t) || delete r[t];
|
|
return (Object.assign(r, e), n);
|
|
})),
|
|
(g.value = r.count ?? 0),
|
|
(y.value = !0),
|
|
(C = t),
|
|
p &&
|
|
writeApiCache(
|
|
n,
|
|
t,
|
|
{
|
|
list: h.value,
|
|
count: g.value,
|
|
},
|
|
A,
|
|
));
|
|
} catch (e) {
|
|
if (!o()) return;
|
|
((v.value = e instanceof Error ? e.message : `加载失败`),
|
|
(!m || !l) && ((h.value = []), (g.value = 0), (y.value = !1)));
|
|
} finally {
|
|
(o() && (_.value = !1), r === S && (E = null));
|
|
}
|
|
})();
|
|
return (
|
|
o() &&
|
|
_.value &&
|
|
(E = {
|
|
query: t,
|
|
identity: n,
|
|
promise: j,
|
|
}),
|
|
j
|
|
);
|
|
}
|
|
function A(e) {
|
|
((b.value = e.page + 1), (x.value = e.rows), k());
|
|
}
|
|
function j() {
|
|
((b.value = 1), k());
|
|
}
|
|
return (
|
|
d.immediate !== !1 && onMounted(k),
|
|
{
|
|
list: h,
|
|
total: g,
|
|
loading: _,
|
|
error: v,
|
|
hasResult: y,
|
|
page: b,
|
|
limit: x,
|
|
load: k,
|
|
onPage: A,
|
|
reload: j,
|
|
}
|
|
);
|
|
}
|
|
export { u as t };
|