Proyectos de Subversion LeadersLinked - SPA

Rev

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