import Link from "next/link"; import { ChevronLeft, ChevronRight, ChevronsLeft, ChevronsRight, Search, } from "lucide-react"; import { Button, buttonVariants } from "@/components/ui/button"; import { MaestrosTable } from "@/components/data-table/maestros-table"; import { AutoSubmitSelect } from "@/components/forms/auto-submit-select"; import { ACCOUNT_TYPE_LABELS, ACCOUNT_TYPES, ACTIVATE_STATUS_LABELS, ACTIVATE_STATUSES, } from "@/lib/constants"; import { getMaestros, type RawSearchParams } from "@/lib/maestros"; import { cn } from "@/lib/utils"; type MaestrosPageProps = { searchParams: Promise; }; const activateStatusOptions = [ ACTIVATE_STATUSES.PENDING, ACTIVATE_STATUSES.TRIAL, ACTIVATE_STATUSES.ACTIVE, ACTIVATE_STATUSES.CANCELED, ] as const; const accountTypeOptions = [ ACCOUNT_TYPES.BASIC_20, ACCOUNT_TYPES.STANDARD_50, ACCOUNT_TYPES.PRO_100, ACCOUNT_TYPES.SCHOOL_500, ACCOUNT_TYPES.SCHOOL_1000, ] as const; const sortOptions = [ { value: "id-desc", label: "ID 최신순" }, { value: "id-asc", label: "ID 오래된순" }, { value: "joinedAt-desc", label: "가입일 최신순" }, { value: "joinedAt-asc", label: "가입일 오래된순" }, { value: "availableAt-desc", label: "사용 가능일 최신순" }, { value: "availableAt-asc", label: "사용 가능일 오래된순" }, ] as const; export default async function MaestrosPage({ searchParams, }: MaestrosPageProps) { const params = await searchParams; const result = await getMaestros(params); const paginationItems = buildPaginationItems(result.page, result.totalPages); const firstVisiblePage = paginationItems[0] ?? 1; const lastVisiblePage = paginationItems.at(-1) ?? result.totalPages; const hasFirstPage = paginationItems.includes(1); const hasLastPage = paginationItems.includes(result.totalPages); const hasPreviousPageGroup = firstVisiblePage > 1; const hasNextPageGroup = lastVisiblePage < result.totalPages; return (

마에스트로

전체 {result.totalCount.toLocaleString()}명 중 {result.page} /{" "} {result.totalPages} 페이지

초기화

페이지당 {result.pageSize}개 표시

); } function buildPageHref(rawParams: RawSearchParams, page: number) { const params = new URLSearchParams(); Object.entries(rawParams).forEach(([key, value]) => { const firstValue = Array.isArray(value) ? value[0] : value; if (firstValue && key !== "page") { params.set(key, firstValue); } }); params.set("page", String(Math.max(1, page))); return `/maestros?${params.toString()}`; } function buildPaginationItems(currentPage: number, totalPages: number) { const startPage = Math.max(1, currentPage - 2); const endPage = Math.min(totalPages, currentPage + 2); return Array.from( { length: endPage - startPage + 1 }, (_, index) => startPage + index ); }