Pagination.tsx 2.0 KB

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