UNPKG

duoyun-ui

Version:

A lightweight desktop UI component library, implemented using Gem

79 lines 2.52 kB
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