"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 { REQUEST_STATUSES } from "@/lib/constants"; import type { ExtensionRequestListItem } from "@/lib/extension-requests"; import { formatDate, getAccountTypeLabel, getActivateStatusLabel, getRequestStatusLabel, } from "@/lib/utils"; type ExtensionRequestsTableProps = { data: ExtensionRequestListItem[]; }; export function ExtensionRequestsTable({ data }: ExtensionRequestsTableProps) { return (
신청ID마에스트로요청 계정현재 계정현재 상태신청일시만료일처리 상태처리 {data.length > 0 ? ( data.map((request) => ( {request.maestroExtensionID} {request.maestroName}

MaestroID {request.maestroID}

{getAccountTypeLabel(request.requestedAccountType)} {getAccountTypeLabel(request.currentAccountType)} {getActivateStatusLabel(request.activateStatus)} {formatDate(request.requestedDateTime)} {formatDate(request.availableActivateDateTime)} {getRequestStatusLabel(request.status)} )) ) : ( )}
조건에 맞는 연장 신청이 없습니다.
); } function ExtensionRequestActions({ request, }: { request: ExtensionRequestListItem; }) { 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" | "cancel") { const actionLabel = action === "approve" ? "승인" : "취소"; if (!window.confirm(`${request.maestroName} 연장 신청을 ${actionLabel}하시겠습니까?`)) { return; } setErrorMessage(""); try { const response = await fetch( `/api/extension-requests/${request.maestroExtensionID}`, { 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 HeaderCell({ children }: { children: React.ReactNode }) { return ( {children} ); } function BodyCell({ children }: { children: React.ReactNode }) { return {children}; }