@hazae41/glacier
Version:
Yet another React data (re)fetching library
77 lines (73 loc) • 2.77 kB
JavaScript
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
;