diff --git a/app/(admin)/maestros/[maestroId]/ExtensionRequestsSection.tsx b/app/(admin)/maestros/[maestroId]/ExtensionRequestsSection.tsx
new file mode 100644
index 0000000..4dc27d9
--- /dev/null
+++ b/app/(admin)/maestros/[maestroId]/ExtensionRequestsSection.tsx
@@ -0,0 +1,144 @@
+"use client";
+
+import { useState, useTransition } from "react";
+import { useRouter } from "next/navigation";
+import { Plus } from "lucide-react";
+
+import { Button } from "@/components/ui/button";
+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 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",
+ headers: { "Content-Type": "application/json" },
+ body: JSON.stringify({ accountType }),
+ }
+ );
+
+ 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}연장 신청 이력
+
+
+
+
+ {["신청ID", "계정 유형", "신청일시", "상태"].map((header) => (
+
+
+
+ {extensionRequests.length > 0 ? (
+ extensionRequests.map((request) => (
+
+ {header}
+
+ ))}
+
+
+ ))
+ ) : (
+
+ {request.maestroExtensionID}
+
+
+ {getAccountTypeLabel(request.accountType)}
+
+
+ {formatDateTime(request.requestedDateTime)}
+
+
+ {getRequestStatusLabel(request.status)}
+
+
+
+ )}
+
+
+ 연장 신청 이력이 없습니다.
+
+
- 전체 {detail.counts.extensionRequests.toLocaleString()}건 중 최근 - 20건 -
-