1. /**
  2. * Paginates a collection of results for staging environments with fallback logic.
  3. *
  4. * @param {Array} data - The array of data to paginate.
  5. * @param {number} pageSize - The number of items per page.
  6. * @param {number} currentPage - The current page number (1-based).
  7. * @param {function} fallback - A function to handle cases where pagination fails.
  8. * @returns {{data: Array, page: number, totalPages: number}} - An object containing the paginated data, current page, and total number of pages. Returns null on error.
  9. */
  10. function paginate(data, pageSize, currentPage, fallback) {
  11. if (!Array.isArray(data)) {
  12. console.error("Data must be an array.");
  13. fallback?.("Invalid data input: Data must be an array."); // Execute fallback if provided
  14. return null;
  15. }
  16. if (typeof pageSize !== 'number' || pageSize <= 0) {
  17. console.error("Page size must be a positive number.");
  18. fallback?.("Invalid page size: Page size must be a positive number.");
  19. return null;
  20. }
  21. if (typeof currentPage !== 'number' || currentPage <= 0) {
  22. console.error("Current page must be a positive number.");
  23. fallback?.("Invalid current page: Current page must be a positive number.");
  24. return null;
  25. }
  26. const startIndex = (currentPage - 1) * pageSize;
  27. const endIndex = startIndex + pageSize;
  28. if (startIndex >= data.length) {
  29. // Handle cases where the current page exceeds the total number of items.
  30. return { data: [], page: currentPage, totalPages: 1 }; // Or handle as needed.
  31. }
  32. const paginatedData = data.slice(startIndex, endIndex);
  33. const totalItems = data.length;
  34. const totalPages = Math.ceil(totalItems / pageSize);
  35. return {
  36. data: paginatedData,
  37. page: currentPage,
  38. totalPages: totalPages,
  39. };
  40. }

Add your comment