Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3642 | Rev 3663 | Ir a la última revisión | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 3642 Rev 3658
Línea 1... Línea 1...
1
import { useEffect, useState, useCallback } from 'react';
1
import { useState, useCallback, useEffect } from 'react';
2
 
-
 
3
import { useApi } from './useApi';
2
import { useApi } from './useApi';
4
import { useAlert } from './useAlert';
3
import { api } from '@shared/libs';
5
import { useInfinityScroll } from './useInfinityScroll';
-
 
6
import { getMessages } from '@inmail/services';
-
 
7
 
-
 
8
export function usePagination(url) {
-
 
9
  const [items, setItems] = useState([]);
-
 
10
  const [page, setPage] = useState(1);
-
 
11
  const [totalPages, setTotalPages] = useState(1);
-
 
12
 
-
 
13
  const { showError } = useAlert();
-
 
14
 
-
 
15
  const { data, loading, execute } = useApi(getMessages, {
-
 
16
    onError: (error) => {
-
 
17
      showError(error.message);
-
 
18
    }
-
 
19
  });
-
 
Línea 20... Línea 4...
20
 
4
 
-
 
5
const apiFunc = (url, page, filters) => {
-
 
6
  return api.get(url, { page, ...filters });
-
 
7
};
-
 
8
 
-
 
9
export const usePagination = (url) => {
21
  const nextPage = useCallback(() => {
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
      );
22
    if (page < totalPages && !loading) {
20
      setHasMore(data.current.page < data.current.totalPages);
23
      setPage((prevPage) => prevPage + 1);
21
      setPage(data.current.page);
24
    }
-
 
25
  }, [page, totalPages, loading]);
-
 
26
 
-
 
27
  const { elementRef } = useInfinityScroll({
-
 
28
    onIntersect: nextPage
22
    }
Línea 29... Línea 23...
29
  });
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(
30
 
31
    (newFilters) => {
31
  const resetPagination = useCallback(() => {
32
      setHasMore(true);
-
 
33
      setData([]);
32
    setItems([]);
34
      setPage(0);
-
 
35
      const filtersToUse = newFilters || filters;
-
 
36
      setFilters(filtersToUse);
-
 
37
      execute(url, 1, filtersToUse);
33
    setPage(1);
38
    },
Línea 34... Línea 39...
34
    setTotalPages(1);
39
    [execute, filters]
35
  }, []);
40
  );
36
 
41
 
37
  useEffect(() => {
42
  useEffect(() => {
38
    if (url) {
43
    if (data.length === 0 && !loading && hasMore && page === 0) {
Línea 39... Línea -...
39
      execute(`${url}?page=${page}`);
-
 
40
    }
44
      refresh(filters);
41
  }, [page, url]);
-
 
42
 
-
 
43
  useEffect(() => {
45
    }
44
    resetPagination();
-
 
45
  }, [url]);
46
  }, [filters, refresh, data.length, loading, hasMore, page]);
46
 
-
 
47
  useEffect(() => {
-
 
48
    if (data) {
-
 
49
      setItems((prevItems) => {
-
 
50
        if (data.current.page > 1) {
47
 
51
          return [...prevItems, ...data.current.items];
48
  const applyFilters = useCallback(
52
        } else {
-
 
53
          return data.current.items;
-
 
54
        }
49
    (newFilters) => {
55
      });
-
 
Línea 56... Línea 50...
56
 
50
      refresh(newFilters);
57
      setTotalPages(data.total.pages);
51
    },
58
    }
52
    [refresh]
-
 
53
  );
-
 
54
 
59
  }, [data]);
55
  return {
60
 
56
    data,
61
  return {
57
    loading,
62
    items,
58
    hasMore,
63
    loading,
59
    filters,