duoyun-ui
Version:
A lightweight desktop UI component library, implemented using Gem
79 lines • 2.52 kB
JavaScript
import { createStore } from '@mantou/gem/lib/store';
import { createCacheStore } from '../lib/utils';
export function createPaginationStore(options) {
const { idKey = 'id', storageKey, cacheItems, pageContainItem, ...rest } = options;
const cacheExcludeKeys = ['loader', 'updatedItem'];
if (!cacheItems)
cacheExcludeKeys.push('items');
const initStore = {
total: 0,
pagination: {},
items: {},
loader: {},
getData(page = 1) {
return store.pagination[page]?.ids?.map((id) => store.items[id]);
},
isLoading(page = 1) {
return !!store.pagination[page]?.loading;
},
};
const { store, saveStore } = storageKey
? createCacheStore(storageKey, initStore, {
...rest,
cacheExcludeKeys,
})
: { store: createStore(initStore), saveStore: () => { } };
const changePage = (page, content) => {
store.pagination[page] = { ...store.pagination[page], ...content };
store();
};
// 指定 API 函数和参数来更新 Store
const updatePage = async (request, q) => {
const req = q || { page: 1, size: 10_000 };
changePage(req.page, { loading: true });
try {
const result = await request(req);
changePage(req.page, { ids: result.list.map((e) => e[idKey]) });
if (pageContainItem) {
result.list.forEach((e) => (store.items[e[idKey]] = e));
}
store({ total: 'total' in result ? result.total : Math.ceil(result.count / req.size) });
}
finally {
changePage(req.page, { loading: false });
}
};
const updateItem = async (request, id) => {
if (typeof request !== 'function') {
const item = request;
store.items[item[idKey]] = item;
store.updatedItem = item;
store();
return;
}
if (id === undefined) {
return;
}
if (store.loader[id])
return;
const loader = request(id);
store.loader[id] = loader;
store();
try {
const item = await loader;
store.items[item[idKey]] = item;
store();
}
finally {
delete store.loader[id];
store();
}
};
return {
store,
saveStore,
updateItem,
updatePage,
};
}
//# sourceMappingURL=store.js.map