"use client"; import { useState, useTransition } from "react"; import { useRouter } from "next/navigation"; import { ArrowUp } from "lucide-react"; import { Button } from "@/components/ui/button"; import { ACCOUNT_TYPES } from "@/lib/constants"; import { formatDateTime, getAccountTypeLabel, getRequestStatusLabel } from "@/lib/utils"; import type { MaestroDetail } from "@/lib/maestros"; type UpgradeRequestsSectionProps = { maestroID: number; accountType: number; totalCount: number; upgradeRequests: MaestroDetail["upgradeRequests"]; }; const upgradeOptions = [ { value: ACCOUNT_TYPES.BASIC_20, label: "1만원 (20명)" }, { value: ACCOUNT_TYPES.STANDARD_50, label: "2만원 (50명)" }, { value: ACCOUNT_TYPES.PRO_100, label: "3만원 (100명)" }, { value: ACCOUNT_TYPES.SCHOOL_500, label: "4만원 (500명)" }, { value: ACCOUNT_TYPES.SCHOOL_1000, label: "5만원 (1,000명)" }, ] as const; const selectClass = "h-9 rounded-md border bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-3 focus:ring-ring/30 disabled:opacity-50"; export function UpgradeRequestsSection({ maestroID, accountType, totalCount, upgradeRequests, }: UpgradeRequestsSectionProps) { const router = useRouter(); const [isPending, startTransition] = useTransition(); const [isCreating, setIsCreating] = useState(false); const [selectedAccountType, setSelectedAccountType] = useState(null); const [errorMessage, setErrorMessage] = useState(""); const isUpgradeEnabled = selectedAccountType !== null && selectedAccountType > accountType; const isDisabled = isCreating || isPending; async function handleUpgrade() { if (selectedAccountType === null) return; if (!window.confirm("업그레이드 신청을 등록하시겠습니까?")) return; setIsCreating(true); setErrorMessage(""); try { const response = await fetch( `/api/maestros/${maestroID}/upgrade-requests`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ requestedAccountType: selectedAccountType }), } ); const body = (await response.json().catch(() => null)) as { message?: string; } | null; if (!response.ok) { throw new Error(body?.message ?? "업그레이드 신청 등록에 실패했습니다."); } setSelectedAccountType(null); startTransition(() => { router.refresh(); }); } catch (error) { setErrorMessage( error instanceof Error ? error.message : "업그레이드 신청 등록에 실패했습니다." ); } finally { setIsCreating(false); } } return (

업그레이드 신청 이력

전체 {totalCount.toLocaleString()}건 중 최근 20건

{errorMessage ? (

{errorMessage}

) : null}
{["신청ID", "현재", "요청", "신청일시", "상태"].map( (header) => ( ) )} {upgradeRequests.length > 0 ? ( upgradeRequests.map((request) => ( )) ) : ( )}
{header}
{request.maestroUpgradeID} {getAccountTypeLabel(request.registeredAccountType)} {getAccountTypeLabel(request.requestedAccountType)} {formatDateTime(request.requestedDateTime)} {getRequestStatusLabel(request.status)}
업그레이드 신청 이력이 없습니다.
); }