File size: 1,426 Bytes
bc20498 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
export function getPageItems({ page = 1, totalPages, siblingCount = 1, }) {
const pageItems = [];
const pagesToShow = new Set([1, totalPages]);
const firstItemWithSiblings = 3 + siblingCount;
const lastItemWithSiblings = totalPages - 2 - siblingCount;
if (firstItemWithSiblings > lastItemWithSiblings) {
for (let p = 2; p <= totalPages - 1; p++) {
pagesToShow.add(p);
}
}
else if (page < firstItemWithSiblings) {
for (let p = 2; p <= Math.min(firstItemWithSiblings, totalPages); p++) {
pagesToShow.add(p);
}
}
else if (page > lastItemWithSiblings) {
for (let p = totalPages - 1; p >= Math.max(lastItemWithSiblings, 2); p--) {
pagesToShow.add(p);
}
}
else {
for (let p = Math.max(page - siblingCount, 2); p <= Math.min(page + siblingCount, totalPages); p++) {
pagesToShow.add(p);
}
}
const addPage = (value) => {
pageItems.push({ type: 'page', value, key: `page-${value}` });
};
const addEllipsis = () => {
pageItems.push({ type: 'ellipsis', key: `ellipsis-${pageItems.length}` });
};
let lastNumber = 0;
for (const page of Array.from(pagesToShow).sort((a, b) => a - b)) {
if (page - lastNumber > 1) {
addEllipsis();
}
addPage(page);
lastNumber = page;
}
return pageItems;
}
|