|
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; |
|
} |
|
|