Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3658 stevensc 1
import { useState, useCallback, useEffect } from 'react';
3604 stevensc 2
import { useApi } from './useApi';
3658 stevensc 3
import { api } from '@shared/libs';
3511 stevensc 4
 
3658 stevensc 5
const apiFunc = (url, page, filters) => {
3663 stevensc 6
  return api.get(url, { params: { page, ...filters } });
3658 stevensc 7
};
3511 stevensc 8
 
3658 stevensc 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({});
3511 stevensc 14
 
3658 stevensc 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.current.totalPages);
21
      setPage(data.current.page);
3610 stevensc 22
    }
23
  });
24
 
3658 stevensc 25
  const loadMore = useCallback(() => {
26
    if (loading || !hasMore) return;
27
    execute(url, page + 1, filters);
28
  }, [loading, hasMore, page, filters]);
3511 stevensc 29
 
3658 stevensc 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
    },
3672 stevensc 39
    [execute, filters, url]
3658 stevensc 40
  );
3607 stevensc 41
 
3603 stevensc 42
  useEffect(() => {
3672 stevensc 43
    if (url && data.length === 0 && !loading && hasMore && page === 0) {
3658 stevensc 44
      refresh(filters);
3604 stevensc 45
    }
3673 stevensc 46
  }, [filters, refresh, data.length, loading, hasMore, page, url]);
3599 stevensc 47
 
3658 stevensc 48
  const applyFilters = useCallback(
49
    (newFilters) => {
50
      refresh(newFilters);
51
    },
52
    [refresh]
53
  );
3603 stevensc 54
 
3511 stevensc 55
  return {
3658 stevensc 56
    data,
3604 stevensc 57
    loading,
3658 stevensc 58
    hasMore,
59
    filters,
60
    loadMore,
61
    refresh,
62
    applyFilters
3511 stevensc 63
  };
3658 stevensc 64
};