Proyectos de Subversion LeadersLinked - SPA

Rev

Rev 3607 | Rev 3642 | 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(() => {
3606 stevensc 22
    console.log('Intersecting');
3604 stevensc 23
    if (page < totalPages && !loading) {
3606 stevensc 24
      console.log('Cambio de pagina');
3599 stevensc 25
      setPage((prevPage) => prevPage + 1);
26
    }
3604 stevensc 27
  }, [page, totalPages, loading]);
3511 stevensc 28
 
3607 stevensc 29
  const { elementRef } = useInfinityScroll({
30
    onIntersect: nextPage
31
  });
32
 
3599 stevensc 33
  const resetPagination = useCallback(() => {
34
    setItems([]);
3604 stevensc 35
    setPage(1);
36
    setTotalPages(1);
37
  }, []);
3599 stevensc 38
 
3603 stevensc 39
  useEffect(() => {
3604 stevensc 40
    if (url) {
3606 stevensc 41
      console.log('Fetching data:', `${url}?page=${page}`);
3604 stevensc 42
      execute(`${url}?page=${page}`);
43
    }
44
  }, [page, url]);
3599 stevensc 45
 
3529 stevensc 46
  useEffect(() => {
3604 stevensc 47
    resetPagination();
48
  }, [url]);
3603 stevensc 49
 
50
  useEffect(() => {
3529 stevensc 51
    if (data) {
3599 stevensc 52
      setItems((prevItems) => {
3610 stevensc 53
        if (data.current.page > 1) {
3604 stevensc 54
          return [...prevItems, ...data.current.items];
3599 stevensc 55
        } else {
3604 stevensc 56
          return data.current.items;
3599 stevensc 57
        }
58
      });
59
 
3604 stevensc 60
      setTotalPages(data.total.pages);
3529 stevensc 61
    }
3610 stevensc 62
  }, [data]);
3529 stevensc 63
 
3511 stevensc 64
  return {
3529 stevensc 65
    items,
3604 stevensc 66
    loading,
3607 stevensc 67
    elementRef,
3511 stevensc 68
    nextPage,
3604 stevensc 69
    resetPagination
3511 stevensc 70
  };
71
}