"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 && (
...
)}
>
)}
{/* 다음 페이지 */}
{/* 마지막 페이지로 */}
);
}