"use client"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { Check, X } from "lucide-react"; import { useState, useTransition } from "react"; import { Button, buttonVariants } from "@/components/ui/button"; import { ACTIVATE_STATUSES, REQUEST_STATUSES } from "@/lib/constants"; import type { UpgradeRequestListItem } from "@/lib/upgrade-requests"; import { formatDate, formatDateTime, getAccountTypeLabel, getActivateStatusLabel, getRequestStatusLabel, getTrialAccountTypeLabel, } from "@/lib/utils"; type UpgradeRequestsTableProps = { data: UpgradeRequestListItem[]; }; export function UpgradeRequestsTable({ data }: UpgradeRequestsTableProps) { return (
신청ID마에스트로현재 상태현재 계정요청 계정추가 금액신청일시만료일처리 상태처리 {data.length > 0 ? ( data.map((request) => ( {request.maestroUpgradeID} {request.maestroName}

MaestroID {request.maestroID}

{getActivateStatusLabel(request.registeredActivateStatus)} {getRegisteredAccountLabel(request)} {getAccountTypeLabel(request.requestedAccountType)} {request.additionalPrice.toLocaleString()}원 {formatDateTime(request.requestedDateTime)} {formatDate(request.availableActivateDateTime)} {getRequestStatusLabel(request.status)} )) ) : ( )}
조건에 맞는 업그레이드 신청이 없습니다.
); } function UpgradeRequestActions({ request, }: { request: UpgradeRequestListItem; }) { const router = useRouter(); const [isPending, startTransition] = useTransition(); const [errorMessage, setErrorMessage] = useState(""); const isRequested = request.status === REQUEST_STATUSES.REQUESTED; if (!isRequested) { return 처리 완료; } async function submitAction(action: "approve" | "reject") { const actionLabel = action === "approve" ? "승인" : "거절"; const confirmed = window.confirm( `${request.maestroName} 업그레이드 신청을 ${actionLabel}하시겠습니까?` ); if (!confirmed) { return; } setErrorMessage(""); try { const response = await fetch( `/api/upgrade-requests/${request.maestroUpgradeID}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action }), } ); if (!response.ok) { const body = (await response.json().catch(() => null)) as { message?: string; } | null; throw new Error( body?.message ?? "업그레이드 신청 처리에 실패했습니다." ); } startTransition(() => { router.refresh(); }); } catch (error) { setErrorMessage( error instanceof Error ? error.message : "업그레이드 신청 처리에 실패했습니다." ); } } return (
{errorMessage ? (

{errorMessage}

) : null}
); } function getRegisteredAccountLabel(request: UpgradeRequestListItem) { if (request.registeredActivateStatus === ACTIVATE_STATUSES.TRIAL) { return getTrialAccountTypeLabel(request.registeredAccountType); } return getAccountTypeLabel(request.registeredAccountType); } function HeaderCell({ children }: { children: React.ReactNode }) { return ( {children} ); } function BodyCell({ children }: { children: React.ReactNode }) { return {children}; }