"use client"; import React from "react"; import { ChevronLeftIcon, ChevronRightIcon, ChevronDoubleLeftIcon, ChevronDoubleRightIcon, } from "@heroicons/react/24/outline"; interface MediaPaginationProps { currentPage: number; totalPages: number; totalItems: number; itemsPerPage: number; onPageChange: (page: number) => void; onItemsPerPageChange: (itemsPerPage: number) => void; className?: string; } const ITEMS_PER_PAGE_OPTIONS = [12, 24, 48, 96]; export function MediaPagination({ currentPage, totalPages, totalItems, itemsPerPage, onPageChange, onItemsPerPageChange, className = "", }: MediaPaginationProps) { const startItem = (currentPage - 1) * itemsPerPage + 1; const endItem = Math.min(currentPage * itemsPerPage, totalItems); const getVisiblePages = () => { const delta = 2; // 현재 페이지 양쪽으로 보여줄 페이지 수 const start = Math.max(1, currentPage - delta); const end = Math.min(totalPages, currentPage + delta); const pages = []; for (let i = start; i <= end; i++) { pages.push(i); } return pages; }; const visiblePages = getVisiblePages(); if (totalPages <= 1) { return null; } return (
{/* 아이템 정보 및 페이지당 아이템 수 선택 */}
{startItem}-{endItem} / 총 {totalItems}개
{/* 페이지 네비게이션 */}
{/* 첫 페이지로 */} {/* 이전 페이지 */} {/* 페이지 번호들 */}
{/* 첫 페이지가 보이지 않으면 표시 */} {visiblePages[0] > 1 && ( <> {visiblePages[0] > 2 && ( ... )} )} {/* 보이는 페이지들 */} {visiblePages.map((page) => ( ))} {/* 마지막 페이지가 보이지 않으면 표시 */} {visiblePages[visiblePages.length - 1] < totalPages && ( <> {visiblePages[visiblePages.length - 1] < totalPages - 1 && ( ... )} )}
{/* 다음 페이지 */} {/* 마지막 페이지로 */}
); }