Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3529 | Rev 3533 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3511 stevensc 1
import { useEffect, useState } from 'react';
2
 
3
import { useFetch } from './useFetch';
4
 
3530 stevensc 5
export function usePagination(
6
  url,
7
  { initialPage = 1, initialLimit = 10, initialParams = {} } = {}
8
) {
3529 stevensc 9
  const [items, setItems] = useState([]);
3511 stevensc 10
  const [page, setPage] = useState(initialPage);
3529 stevensc 11
  const [totalPages, setTotalPages] = useState(0);
3511 stevensc 12
  const [limit, setLimit] = useState(initialLimit);
3530 stevensc 13
  const [params, setParams] = useState({ page, limit, ...initialParams });
3511 stevensc 14
 
3529 stevensc 15
  const { data, loading, error, refetch } = useFetch(url, {
16
    params
17
  });
3511 stevensc 18
 
19
  const nextPage = () => {
20
    setPage((prevPage) => prevPage + 1);
21
  };
22
 
23
  const prevPage = () => {
24
    setPage((prevPage) => Math.max(1, prevPage - 1));
25
  };
26
 
27
  const goToPage = (newPage) => {
28
    setPage(newPage);
29
  };
30
 
31
  const setPageLimit = (newLimit) => {
32
    setLimit(newLimit);
3529 stevensc 33
    setPage(1);
3511 stevensc 34
  };
35
 
3529 stevensc 36
  const hasMore = page < totalPages;
3511 stevensc 37
 
3529 stevensc 38
  useEffect(() => {
39
    if (data) {
40
      setItems(data.current.items);
41
      setTotalPages(data.total.pages);
42
    }
43
  }, [data]);
44
 
45
  useEffect(() => {
46
    setParams({ ...initialParams, page, limit });
47
  }, [page, limit]);
48
 
3511 stevensc 49
  return {
3529 stevensc 50
    items,
3511 stevensc 51
    page,
52
    limit,
3529 stevensc 53
    error,
3511 stevensc 54
    loading,
3529 stevensc 55
    totalPages,
56
    hasMore,
3511 stevensc 57
    nextPage,
58
    prevPage,
59
    goToPage,
60
    setPageLimit,
3529 stevensc 61
    refetch
3511 stevensc 62
  };
63
}