You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

usePagingHook.js 1.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. import { useState, useCallback, useEffect } from 'react';
  2. import { unstable_batchedUpdates } from 'react-dom';
  3. const usePagingHook = (page, itemsPerPage, sort, filter, apiCallback) => {
  4. const [items, setItems] = useState([]);
  5. const [totalPages, setTotalPages] = useState(0);
  6. const [currentPage, setCurrentPage] = useState(0);
  7. const [loading, setLoading] = useState(false);
  8. const [totalCount, setTotalCount] = useState(0);
  9. const reload = useCallback(async () => {
  10. setLoading(true);
  11. try {
  12. const [sortColumn, sortDirection] = sort.split('-');
  13. const response = await apiCallback(
  14. page,
  15. itemsPerPage,
  16. sortColumn,
  17. sortDirection,
  18. filter
  19. );
  20. if (response.status === 200) {
  21. // Prevents multiple rerenders
  22. unstable_batchedUpdates(() => {
  23. setItems(response.data);
  24. setTotalCount(parseInt(response.headers['x-total-count']));
  25. setTotalPages(
  26. Math.ceil(response.headers['x-total-count'] / itemsPerPage)
  27. );
  28. setCurrentPage(page);
  29. });
  30. }
  31. } catch (e) {
  32. console.error(e);
  33. } finally {
  34. setLoading(false);
  35. }
  36. }, [
  37. setItems,
  38. setLoading,
  39. setTotalPages,
  40. setCurrentPage,
  41. apiCallback,
  42. page,
  43. itemsPerPage,
  44. sort,
  45. filter,
  46. ]);
  47. useEffect(() => {
  48. reload();
  49. }, [reload]);
  50. return {
  51. items,
  52. loading,
  53. reload,
  54. totalCount,
  55. totalPages,
  56. currentPage,
  57. itemsPerPage,
  58. sort,
  59. };
  60. };
  61. export default usePagingHook;