import React, { type FC } from 'react';
import { HiChevronLeft, HiChevronRight } from 'react-icons/hi2';
import classNames from 'clsx';
import { Button } from '../Button/Button';
export const Pagination: FC<{
pageIndex: number;
onPageIndexChange?: (v: number) => void;
href?: (v: number) => string;
pageCount: number;
pageOptions?: number[];
}> = ({ pageIndex = 0, onPageIndexChange, pageCount, href, pageOptions = buildPageOptions(pageIndex, pageCount) }) => {
const pageNumber = pageIndex + 1;
const canNextPage = pageNumber < pageCount;
const canPreviousPage = pageNumber > 1;
// const previousPage = () => onPageIndexChange?.(pageIndex - 1);
// const nextPage = () => onPageIndexChange?.(pageIndex + 1);
// let firstPage = () => onPageIndexChange(0);
// let lastPage = () => onPageIndexChange(pageCount - 1);
return (
{/*
*/}
{/*
*/}
{canPreviousPage && (
)}
{!canPreviousPage && (
)}
{!pageOptions && (
)}
{pageOptions?.map((v, i) => {
let n = v;
switch (v) {
case -1:
n = pageIndex - 5;
break;
case -2:
n = pageIndex + 5;
break;
}
return (
);
})}
{canNextPage && (
)}
{!canNextPage && (
)}
{/*
*/}
{/*
*/}
{/*
*/}
{/*
*/}
{/* */}
{/* */}
{/* */}
{/* */}
);
};
const clamp = (value: number, min: number, max: number) => Math.min(Math.max(value, min), max);
export function buildPageOptions(pageIndex: number, pageCount: number): number[] {
let ops: number[] = [];
// 默认显示 5 个 - 包含最前最后就是7个
if (pageCount <= 7) {
ops = new Array(pageCount).fill(null).map((_, i) => i);
} else {
let min = clamp(pageIndex - 2, 0, pageCount - 1);
let max = clamp(pageIndex + 2, 0, pageCount - 1);
// 处理不够补齐情况
const maxPad = Math.abs(pageIndex - 2 - min);
const minPad = Math.abs(pageIndex + 2 - max);
max += maxPad;
min -= minPad;
if (min !== 0) {
ops.push(0);
if (min !== 1) {
ops.push(-1);
}
}
for (let i = min; i < pageIndex; i++) {
ops.push(i);
}
ops.push(pageIndex);
for (let i = pageIndex + 1; i <= max; i++) {
ops.push(i);
}
if (max < pageCount - 1) {
if (max !== pageCount - 2) {
ops.push(-2);
}
ops.push(pageCount - 1);
}
}
return ops;
}