Passed
Push — master ( cfe6bd...bdceca )
by Guangyu
04:33 queued 12s
created

src/hooks/usePagination.js   A

Complexity

Total Complexity 3
Complexity/F 0

Size

Lines of Code 54
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 3
eloc 50
mnd 3
bc 3
fnc 0
dl 0
loc 54
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
rs 10
1
import { useState, useEffect } from 'react';
2
import chunk from 'lodash/chunk';
3
import { isIterableArray } from '../helpers/utils';
4
5
const usePagination = (items, defaultItemsPerPage = 5) => {
6
  const [data, setData] = useState([]);
7
  const [itemsChunk, setItemsChunk] = useState([]);
8
  const [total, setTotal] = useState(0);
9
  const [lastPageNo, setLastPageNo] = useState(0);
10
  const [itemsPerPage, setItemsPerPage] = useState(defaultItemsPerPage);
11
  const [pageNo, setPageNo] = useState(null);
12
  const [from, setFrom] = useState(1);
13
  const [to, setTo] = useState(itemsPerPage);
14
  const [prevPageNo, setPrevPageNo] = useState(true);
15
  const [nextPageNo, setNextPageNo] = useState(true);
16
17
  useEffect(() => {
18
    setData(isIterableArray(itemsChunk[pageNo - 1]) ? itemsChunk[pageNo - 1] : []);
19
  }, [setData, itemsPerPage, itemsChunk, pageNo]);
20
21
  useEffect(() => {
22
    setItemsChunk(chunk(items, itemsPerPage));
23
    setPageNo(1);
24
    setTotal(items.length);
25
  }, [itemsPerPage, setPageNo, items]);
26
27
  useEffect(() => {
28
    setFrom(itemsPerPage * (pageNo - 1) + 1);
29
    setTo(itemsPerPage * (pageNo - 1) + data.length);
30
    setPrevPageNo(pageNo > 1 ? pageNo - 1 : null);
31
    setNextPageNo(pageNo < lastPageNo ? pageNo + 1 : null);
32
  }, [itemsPerPage, pageNo, data, lastPageNo]);
33
34
  useEffect(() => {
35
    setLastPageNo(itemsChunk.length);
36
  }, [itemsChunk]);
37
38
  const handleNextPage = () => setPageNo(pageNo + 1);
39
  const handlePrevPage = () => setPageNo(pageNo - 1);
40
41
  return {
42
    data,
43
    meta: { total, pageNo, lastPageNo, itemsPerPage, from, to, nextPageNo, prevPageNo },
44
    handler: {
45
      nextPage: handleNextPage,
46
      prevPage: handlePrevPage,
47
      currentPage: setPageNo,
48
      perPage: setItemsPerPage
49
    }
50
  };
51
};
52
53
export default usePagination;
54