Proyectos de Subversion LeadersLinked - SPA

Rev

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