Rev 3610 | Rev 3658 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
import { useEffect, useState, useCallback } from 'react';
import { useApi } from './useApi';
import { useAlert } from './useAlert';
import { useInfinityScroll } from './useInfinityScroll';
import { getMessages } from '@inmail/services';
export function usePagination(url) {
const [items, setItems] = useState([]);
const [page, setPage] = useState(1);
const [totalPages, setTotalPages] = useState(1);
const { showError } = useAlert();
const { data, loading, execute } = useApi(getMessages, {
onError: (error) => {
showError(error.message);
}
});
const nextPage = useCallback(() => {
if (page < totalPages && !loading) {
setPage((prevPage) => prevPage + 1);
}
}, [page, totalPages, loading]);
const { elementRef } = useInfinityScroll({
onIntersect: nextPage
});
const resetPagination = useCallback(() => {
setItems([]);
setPage(1);
setTotalPages(1);
}, []);
useEffect(() => {
if (url) {
execute(`${url}?page=${page}`);
}
}, [page, url]);
useEffect(() => {
resetPagination();
}, [url]);
useEffect(() => {
if (data) {
setItems((prevItems) => {
if (data.current.page > 1) {
return [...prevItems, ...data.current.items];
} else {
return data.current.items;
}
});
setTotalPages(data.total.pages);
}
}, [data]);
return {
items,
loading,
elementRef,
nextPage,
resetPagination
};
}