Pagination.tsx 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. 'use client';
  2. import '../styles/common.scss';
  3. import React from 'react';
  4. interface PaginationProps {
  5. total: number;
  6. page?: number;
  7. perPage?: number;
  8. onChange: (page: number) => void;
  9. }
  10. export default function Pagination({ total, page = 1, perPage = 10, onChange }: PaginationProps) {
  11. const totalPage = (Math.ceil(total / perPage));
  12. const handlePrevious = () => {
  13. if (page > 1) {
  14. onChange(page - 1);
  15. }
  16. };
  17. const handleNext = () => {
  18. if (page < totalPage) {
  19. onChange(page + 1);
  20. }
  21. };
  22. if (page > totalPage) {
  23. return;
  24. }
  25. return (
  26. <div id='pagination' className='mt-3'>
  27. {totalPage > 1 && (
  28. <button type='button' onClick={handlePrevious} disabled={page === 1}>
  29. 이전
  30. </button>
  31. )}
  32. {totalPage > 7 ? (
  33. <>
  34. {page > 3 && <button type="button" onClick={() => onChange(1)}>1</button>}
  35. {page > 4 && <span>...</span>}
  36. {Array.from({ length: 5 }, (_, index) => {
  37. const pageNumber = page - 2 + index;
  38. if (pageNumber > 0 && pageNumber <= totalPage) {
  39. return (
  40. <button type='button'
  41. key={pageNumber}
  42. onClick={() => onChange(pageNumber)}
  43. {...(page === pageNumber ? { className: 'active' } : {})}
  44. >
  45. {pageNumber}
  46. </button>
  47. );
  48. }
  49. return null;
  50. })}
  51. {page < totalPage - 3 && <span>...</span>}
  52. {page < totalPage - 2 && <button type='button' onClick={() => onChange(totalPage)}>{totalPage}</button>}
  53. </>
  54. ) : (
  55. Array.from({ length: totalPage }, (_, index) => (
  56. <button type='button'
  57. key={index + 1}
  58. onClick={() => onChange(index + 1)}
  59. {...(page === index + 1 ? { className: 'active' } : {})}
  60. >
  61. {index + 1}
  62. </button>
  63. ))
  64. )}
  65. {totalPage > 1 && (
  66. <button type='button' onClick={handleNext} disabled={page === totalPage}>
  67. 다음
  68. </button>
  69. )}
  70. </div>
  71. );
  72. }