"use client"; import { useState, useTransition } from "react"; import { useRouter } from "next/navigation"; import { Plus } from "lucide-react"; import { Button } from "@/components/ui/button"; import { PAID_ACCOUNT_TYPE_VALUES } from "@/lib/constants"; import { formatDateTime, getAccountTypeLabel, getRequestStatusLabel } from "@/lib/utils"; import type { MaestroDetail } from "@/lib/maestros"; type ExtensionRequestsSectionProps = { maestroID: number; accountType: number; totalCount: number; extensionRequests: MaestroDetail["extensionRequests"]; }; export function ExtensionRequestsSection({ maestroID, accountType, totalCount, extensionRequests, }: ExtensionRequestsSectionProps) { const router = useRouter(); const [isPending, startTransition] = useTransition(); const [isCreating, setIsCreating] = useState(false); const [errorMessage, setErrorMessage] = useState(""); const isPaidAccount = (PAID_ACCOUNT_TYPE_VALUES as readonly number[]).includes(accountType); const isDisabled = isCreating || isPending; async function handleCreate() { if (!window.confirm("연장 신청을 등록하시겠습니까?")) return; setIsCreating(true); setErrorMessage(""); try { const response = await fetch( `/api/maestros/${maestroID}/extension-requests`, { method: "POST" } ); const body = (await response.json().catch(() => null)) as { message?: string; } | null; if (!response.ok) { throw new Error(body?.message ?? "연장 신청 등록에 실패했습니다."); } startTransition(() => { router.refresh(); }); } catch (error) { setErrorMessage( error instanceof Error ? error.message : "연장 신청 등록에 실패했습니다." ); } finally { setIsCreating(false); } } return (

연장 신청 이력

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

{errorMessage ? (

{errorMessage}

) : null}
{["신청ID", "계정 유형", "신청일시", "상태"].map((header) => ( ))} {extensionRequests.length > 0 ? ( extensionRequests.map((request) => ( )) ) : ( )}
{header}
{request.maestroExtensionID} {getAccountTypeLabel(request.accountType)} {formatDateTime(request.requestedDateTime)} {getRequestStatusLabel(request.status)}
연장 신청 이력이 없습니다.
); }