Proyectos de Subversion LeadersLinked - SPA

Rev

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

Rev Autor Línea Nro. Línea
3604 stevensc 1
import { useEffect, useState, useCallback } from 'react';
3511 stevensc 2
 
3604 stevensc 3
import { useApi } from './useApi';
3610 stevensc 4
import { useAlert } from './useAlert';
5
import { useInfinityScroll } from './useInfinityScroll';
3604 stevensc 6
import { getMessages } from '@inmail/services';
3511 stevensc 7
 
3604 stevensc 8
export function usePagination(url) {
3529 stevensc 9
  const [items, setItems] = useState([]);
3604 stevensc 10
  const [page, setPage] = useState(1);
11
  const [totalPages, setTotalPages] = useState(1);
3511 stevensc 12
 
3610 stevensc 13
  const { showError } = useAlert();
3511 stevensc 14
 
3610 stevensc 15
  const { data, loading, execute } = useApi(getMessages, {
16
    onError: (error) => {
17
      showError(error.message);
18
    }
19
  });
20
 
3599 stevensc 21
  const nextPage = useCallback(() => {
3604 stevensc 22
    if (page < totalPages && !loading) {
3599 stevensc 23
      setPage((prevPage) => prevPage + 1);
24
    }
3604 stevensc 25
  }, [page, totalPages, loading]);
3511 stevensc 26
 
3607 stevensc 27
  const { elementRef } = useInfinityScroll({
28
    onIntersect: nextPage
29
  });
30
 
3599 stevensc 31
  const resetPagination = useCallback(() => {
32
    setItems([]);
3604 stevensc 33
    setPage(1);
34
    setTotalPages(1);
35
  }, []);
3599 stevensc 36
 
3603 stevensc 37
  useEffect(() => {
3604 stevensc 38
    if (url) {
39
      execute(`${url}?page=${page}`);
40
    }
41
  }, [page, url]);
3599 stevensc 42
 
3529 stevensc 43
  useEffect(() => {
3604 stevensc 44
    resetPagination();
45
  }, [url]);
3603 stevensc 46
 
47
  useEffect(() => {
3529 stevensc 48
    if (data) {
3599 stevensc 49
      setItems((prevItems) => {
3610 stevensc 50
        if (data.current.page > 1) {
3604 stevensc 51
          return [...prevItems, ...data.current.items];
3599 stevensc 52
        } else {
3604 stevensc 53
          return data.current.items;
3599 stevensc 54
        }
55
      });
56
 
3604 stevensc 57
      setTotalPages(data.total.pages);
3529 stevensc 58
    }
3610 stevensc 59
  }, [data]);
3529 stevensc 60
 
3511 stevensc 61
  return {
3529 stevensc 62
    items,
3604 stevensc 63
    loading,
3607 stevensc 64
    elementRef,
3511 stevensc 65
    nextPage,
3604 stevensc 66
    resetPagination
3511 stevensc 67
  };
68
}