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};};