diff --git a/src/assets/icons/arrow-left-gray.svg b/src/assets/icons/arrow-left-gray.svg new file mode 100644 index 00000000..4f61fa3c --- /dev/null +++ b/src/assets/icons/arrow-left-gray.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/assets/icons/arrow-left.svg b/src/assets/icons/arrow-left.svg new file mode 100644 index 00000000..39da8073 --- /dev/null +++ b/src/assets/icons/arrow-left.svg @@ -0,0 +1,8 @@ + + + diff --git a/src/assets/icons/arrow-right.svg b/src/assets/icons/arrow-right.svg new file mode 100644 index 00000000..620f1b37 --- /dev/null +++ b/src/assets/icons/arrow-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/components/common/Pagination.tsx b/src/components/common/Pagination.tsx new file mode 100644 index 00000000..fa396dc3 --- /dev/null +++ b/src/components/common/Pagination.tsx @@ -0,0 +1,78 @@ +import ArrowLeft from '@/assets/icons/arrow-left.svg'; +import ArrowLeftGray from '@/assets/icons/arrow-left-gray.svg'; +import ArrowRight from '@/assets/icons/arrow-right.svg'; + +interface Props { + totalPages: number; + currentPage: number; + setCurrentPage: React.Dispatch>; +} + +export default function Pagination({ + totalPages, + currentPage, + setCurrentPage, +}: Props) { + const handleClick = (page: number) => { + setCurrentPage(page); + }; + + const range = (start: number, end: number) => { + return Array.from({ length: end - start + 1 }, (_, i) => start + i); + }; + + let start = 1; + let end = 7; + + if (currentPage > 4) { + start = currentPage - 3; + end = currentPage + 3; + } + + if (end > totalPages) { + end = totalPages; + start = Math.max(end - 6, 1); + } + + const pageNumbers = range(start, end); + + return ( + + {/* 왼쪽 화살표 */} + {totalPages > 7 && ( + handleClick(1)}> + + + )} + + {/* 페이지 버튼들 */} + + {pageNumbers.map((page) => ( + handleClick(page)} + className={`flex size-32 items-center justify-center rounded-sm text-caption md:size-40 md:text-body2 ${ + currentPage === page + ? 'bg-red-30 text-white' + : 'bg-white text-black' + }`} + > + {page} + + ))} + + + {/* 오른쪽 화살표 */} + {totalPages > 7 && currentPage < totalPages && ( + handleClick(totalPages)}> + + + )} + + ); +}