All files / components/pagination pagination.js

0% Statements 0/47
0% Branches 0/28
0% Functions 0/7
0% Lines 0/30
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 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77                                                                                                                                                         
const centerRule = ({ total, activePage }) => (
  activePage - 1 <= 0
    ? 1 : activePage === total
      ? activePage - 2 : activePage - 1
)
 
const isNumber = (value) => typeof value === 'number'
 
export const pagination = ({ total = 1, activePage = 1 } = {}) => {
  if (!isNumber(total)) {
    throw new TypeError('total should be a number')
  }
 
  if (!isNumber(activePage)) {
    throw new TypeError('activePage should be a number')
  }
 
  if (total <= 5) {
    return Array.from({ length: total }, (_, i) => i + 1)
  }
 
  const visiblePages = 3
  let pages = [
    1,
    ...Array.from({ length: visiblePages }, (_, i) => i + centerRule({ total, activePage })),
    total
  ]
 
  pages = pages.filter((page, index, array) => array.indexOf(page) === index)
 
  let firstPage = pages[0]
  let secondPage = pages[1]
 
  if (secondPage === (firstPage + 2)) {
    pages = [
      firstPage,
      firstPage + 1,
      ...pages.slice(1)
    ]
  }
 
  firstPage = pages[0]
  secondPage = pages[1]
 
  if (secondPage > (firstPage + 2)) {
    pages = [
      firstPage,
      '...',
      ...pages.slice(1)
    ]
  }
 
  let penultimatePage = pages[pages.length - 2]
  let lastPage = pages[pages.length - 1]
 
  if (penultimatePage === (lastPage - 2)) {
    pages = [
      ...pages.slice(0, -1),
      lastPage - 1,
      lastPage
    ]
  }
 
  penultimatePage = pages[pages.length - 2]
  lastPage = pages[pages.length - 1]
 
  if (penultimatePage < (lastPage - 2)) {
    pages = [
      ...pages.slice(0, -1),
      '...',
      lastPage
    ]
  }
 
  return pages
}