"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, 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()}원 {formatDate(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 [emailWarning, setEmailWarning] = useState(false); const isRequested = request.status === REQUEST_STATUSES.REQUESTED; if (!isRequested && !emailWarning) { return 처리 완료; } async function submitAction(action: "approve" | "reject") { const actionLabel = action === "approve" ? "승인" : "거절"; if (!window.confirm(`${request.maestroName} 업그레이드 신청을 ${actionLabel}하시겠습니까?`)) { return; } setErrorMessage(""); try { const response = await fetch( `/api/upgrade-requests/${request.maestroUpgradeID}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ action }), } ); const body = (await response.json().catch(() => null)) as { message?: string; emailSent?: boolean; } | null; if (!response.ok) { throw new Error(body?.message ?? "업그레이드 신청 처리에 실패했습니다."); } if (action === "approve" && body?.emailSent === false) { setEmailWarning(true); } startTransition(() => { router.refresh(); }); } catch (error) { setErrorMessage( error instanceof Error ? error.message : "업그레이드 신청 처리에 실패했습니다." ); } } return (
{isRequested ? (
) : ( 처리 완료 )} {emailWarning ? (

이메일 발송 실패 — 수동 확인 필요

) : null} {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}; }