Rev 3674 | AutorÃa | Comparar con el anterior | Ultima modificación | Ver Log |
import { useState, useCallback, useEffect } from 'react';
import { useApi } from './useApi';
import { api } from '@shared/libs';
const apiFunc = (url, page, filters) => {
return api.get(url, { params: { page, ...filters } });
};
export const usePagination = (url) => {
const [data, setData] = useState([]);
const [page, setPage] = useState(0);
const [hasMore, setHasMore] = useState(true);
const [filters, setFilters] = useState({});
const { loading, execute } = useApi(apiFunc, {
onSuccess: (data) => {
setData((prevData) =>
data.current.page > 1 ? [...prevData, ...data.current.items] : data.current.items
);
setHasMore(data.current.page < data.total.pages);
setPage(data.current.page);
}
});
const loadMore = useCallback(() => {
if (loading || !hasMore) return;
execute(url, page + 1, filters);
}, [loading, hasMore, page, filters]);
const refresh = useCallback(
(newFilters) => {
setHasMore(true);
setData([]);
setPage(0);
const filtersToUse = newFilters || filters;
setFilters(filtersToUse);
execute(url, 1, filtersToUse);
},
[execute, filters, url]
);
useEffect(() => {
if (url && data.length === 0 && !loading && hasMore && page === 0) {
refresh(filters);
}
}, [filters, refresh, data.length, loading, hasMore, page, url]);
const applyFilters = useCallback(
(newFilters) => {
refresh(newFilters);
},
[refresh]
);
return {
data,
loading,
hasMore,
filters,
loadMore,
refresh,
applyFilters
};
};