@sinchsmb/ui-kit
Version:
UI kit for SinchSMB frontend
50 lines (41 loc) • 1.33 kB
text/typescript
import range from 'lodash/range';
const MAX_FIT_PAGES = 7;
export enum PaginationSpecialPages {
MorePagesLeft = 'morePagesLeft',
MorePagesRight = 'morePagesRight',
}
export type Pages = number | PaginationSpecialPages;
/**
* Returns map of pages that must be rendered
*
* @param currentPage Current page number starts from 0
* @param totalPages Total pages count
*/
export function getRanges(currentPage: number, totalPages: number): Pages[] {
if (totalPages <= MAX_FIT_PAGES) {
return range(0, Math.max(totalPages, 1));
}
const selectedPage =
currentPage >= totalPages ? totalPages - 1 : Math.min(Math.max(currentPage, 0), Math.max(totalPages, 0));
const result: Pages[] = [selectedPage];
for (let i = 1; i < MAX_FIT_PAGES + 1; ++i) {
if (selectedPage + i < totalPages) {
result.push(selectedPage + i);
}
if (selectedPage - i >= 0 && result.length < MAX_FIT_PAGES) {
result.unshift(selectedPage - i);
}
if (result.length >= MAX_FIT_PAGES) {
break;
}
}
if (result[0] !== 0) {
result[0] = 0;
result[1] = PaginationSpecialPages.MorePagesLeft;
}
if (result[result.length - 1] !== totalPages - 1) {
result[result.length - 1] = totalPages - 1;
result[result.length - 2] = PaginationSpecialPages.MorePagesRight;
}
return result;
}