Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3674 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
3719 stevensc 1
import { useState, useCallback, useEffect } from 'react';
2
import { useApi } from './useApi';
3
import { api } from '@shared/libs';
4
 
5
const apiFunc = (url, page, filters) => {
6
  return api.get(url, { params: { page, ...filters } });
7
};
8
 
9
export const usePagination = (url) => {
10
  const [data, setData] = useState([]);
11
  const [page, setPage] = useState(0);
12
  const [hasMore, setHasMore] = useState(true);
13
  const [filters, setFilters] = useState({});
14
 
15
  const { loading, execute } = useApi(apiFunc, {
16
    onSuccess: (data) => {
17
      setData((prevData) =>
18
        data.current.page > 1 ? [...prevData, ...data.current.items] : data.current.items
19
      );
20
      setHasMore(data.current.page < data.total.pages);
21
      setPage(data.current.page);
22
    }
23
  });
24
 
25
  const loadMore = useCallback(() => {
26
    if (loading || !hasMore) return;
27
    execute(url, page + 1, filters);
28
  }, [loading, hasMore, page, filters]);
29
 
30
  const refresh = useCallback(
31
    (newFilters) => {
32
      setHasMore(true);
33
      setData([]);
34
      setPage(0);
35
      const filtersToUse = newFilters || filters;
36
      setFilters(filtersToUse);
37
      execute(url, 1, filtersToUse);
38
    },
39
    [execute, filters, url]
40
  );
41
 
42
  useEffect(() => {
43
    if (url && data.length === 0 && !loading && hasMore && page === 0) {
44
      refresh(filters);
45
    }
46
  }, [filters, refresh, data.length, loading, hasMore, page, url]);
47
 
48
  const applyFilters = useCallback(
49
    (newFilters) => {
50
      refresh(newFilters);
51
    },
52
    [refresh]
53
  );
54
 
55
  return {
56
    data,
57
    loading,
58
    hasMore,
59
    filters,
60
    loadMore,
61
    refresh,
62
    applyFilters
63
  };
64
};