Proyectos de Subversion LeadersLinked - SPA

Rev

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