UNPKG

@sinchsmb/ui-kit

Version:

UI kit for SinchSMB frontend

50 lines (41 loc) 1.33 kB
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; }