@techsio/storefront-data
Version:
Medusa-first storefront data layer built on TanStack Query.
50 lines (49 loc) • 2.17 kB
JavaScript
const uniquePages = (pages)=>Array.from(new Set(pages));
const pushPageIfValid = (pages, page, input)=>{
if (null == page) return;
if (page < 1 || page > input.totalPages) return;
pages.push(page);
};
const createSimplePrefetchPagesPlan = (input)=>{
const pagesToPrefetch = [];
pushPageIfValid(pagesToPrefetch, 1 !== input.currentPage ? 1 : null, input);
pushPageIfValid(pagesToPrefetch, input.hasPrevPage ? input.currentPage - 1 : null, input);
pushPageIfValid(pagesToPrefetch, input.hasPrevPage ? input.currentPage - 2 : null, input);
pushPageIfValid(pagesToPrefetch, input.hasNextPage ? input.currentPage + 1 : null, input);
pushPageIfValid(pagesToPrefetch, input.hasNextPage ? input.currentPage + 2 : null, input);
pushPageIfValid(pagesToPrefetch, input.currentPage !== input.totalPages ? input.totalPages : null, input);
return {
immediate: uniquePages(pagesToPrefetch),
medium: [],
low: []
};
};
const createPriorityPrefetchPagesPlan = (input)=>{
const high = input.hasNextPage ? [
input.currentPage + 1
] : [];
const medium = input.hasNextPage && input.currentPage + 2 <= input.totalPages ? [
input.currentPage + 2
] : [];
const lowCandidates = [
input.hasPrevPage ? input.currentPage - 1 : null,
1 !== input.currentPage ? 1 : null,
input.totalPages > 1 && input.currentPage !== input.totalPages ? input.totalPages : null
].filter((page)=>null !== page);
const immediate = uniquePages(high);
const immediateSet = new Set(immediate);
const mediumPages = uniquePages(medium).filter((page)=>!immediateSet.has(page));
const mediumSet = new Set(mediumPages);
const lowPages = uniquePages(lowCandidates).filter((page)=>!(immediateSet.has(page) || mediumSet.has(page)));
return {
immediate,
medium: mediumPages,
low: lowPages
};
};
const createPrefetchPagesPlan = (input)=>{
const mode = input.mode ?? "priority";
if ("simple" === mode) return createSimplePrefetchPagesPlan(input);
return createPriorityPrefetchPagesPlan(input);
};
export { createPrefetchPagesPlan };