UNPKG

@hazae41/glacier

Version:

Yet another React data (re)fetching library

77 lines (73 loc) 2.77 kB
'use strict'; var option = require('@hazae41/option'); var arrays = require('../../../libs/arrays/arrays.cjs'); var index = require('../../../libs/equals/index.cjs'); var core = require('../../core/core.cjs'); var fetched = require('../../fetched/fetched.cjs'); var _a; class ScrollError extends Error { #class = _a; name = this.#class.name; constructor() { super(`Could not scroll`); } } _a = ScrollError; exports.Scrollable = void 0; (function (Scrollable) { function getCacheKey(key) { if (typeof key === "string") return key; return `scroll:${JSON.stringify(key)}`; } Scrollable.getCacheKey = getCacheKey; /** * Fetch first page and compare it to the previous first page * @param core * @param scroller * @param cacheKey * @param fetcher * @param aborter * @param settings * @returns */ async function fetchOrThrow(cacheKey, signal, settings) { const fetched$1 = fetched.Fetched.from(await settings.fetcher(settings.key, { signal })); return await core.core.mutateOrThrow(cacheKey, async (previous) => { if (fetched$1.isErr()) return new option.Some(fetched$1); const prenormalized = await core.core.prenormalizeOrThrow(fetched$1, settings); if (prenormalized?.isData() && previous.real?.data && index.equals(prenormalized.get(), previous.real.data.get())) return new option.Some(previous.real.data); return new option.Some(fetched$1); }, settings); } Scrollable.fetchOrThrow = fetchOrThrow; /** * Scroll to the next page * @param core * @param scroller * @param cacheKey * @param fetcher * @param aborter * @param settings * @returns */ async function scrollOrThrow(cacheKey, signal, settings) { const previous = await core.core.getOrThrow(cacheKey, settings); const previousPages = previous.real?.data?.get() ?? []; const previousPage = arrays.Arrays.last(previousPages); const key = settings.scroller(previousPage); if (key == null) throw new ScrollError(); const fetched$1 = fetched.Fetched.from(await settings.fetcher(key, { signal })); return await core.core.mutateOrThrow(cacheKey, async (previous) => { const previousPages = previous.real?.data?.get() ?? []; const paginated = fetched$1.mapSync(data => [...previousPages, ...data]); return new option.Some(paginated); }, settings); } Scrollable.scrollOrThrow = scrollOrThrow; })(exports.Scrollable || (exports.Scrollable = {})); exports.ScrollError = ScrollError; //# sourceMappingURL=helper.cjs.map