"use client"; import { useState, useTransition } from "react"; import { useRouter } from "next/navigation"; import { Save } from "lucide-react"; import { Button } from "@/components/ui/button"; import { ACCOUNT_TYPE_LABELS, ACCOUNT_TYPES, ACTIVATE_STATUS_LABELS, ACTIVATE_STATUSES, } from "@/lib/constants"; import { formatDate, formatDateTime, toDatetimeLocal } from "@/lib/utils"; import type { MaestroDetail } from "@/lib/maestros"; type MaestroEditFormProps = { maestro: MaestroDetail["maestro"]; playerCount: number; }; const paidAccountTypeOptions = [ ACCOUNT_TYPES.BASIC_20, ACCOUNT_TYPES.STANDARD_50, ACCOUNT_TYPES.PRO_100, ACCOUNT_TYPES.SCHOOL_500, ACCOUNT_TYPES.SCHOOL_1000, ] as const; const activateStatusOptions = [ ACTIVATE_STATUSES.PENDING, ACTIVATE_STATUSES.TRIAL, ACTIVATE_STATUSES.ACTIVE, ACTIVATE_STATUSES.CANCELED, ] as const; const inputClass = "h-9 w-full rounded-md border bg-background px-3 text-sm outline-none transition-colors focus:border-ring focus:ring-3 focus:ring-ring/30 disabled:opacity-50"; export function MaestroEditForm({ maestro, playerCount }: MaestroEditFormProps) { const router = useRouter(); const [isPending, startTransition] = useTransition(); const [isSaving, setIsSaving] = useState(false); const [name, setName] = useState(maestro.name); const [email, setEmail] = useState(maestro.email); const [activateStatus, setActivateStatus] = useState(maestro.activateStatus); const [accountType, setAccountType] = useState(maestro.accountType); const [availableActivateDateTime, setAvailableActivateDateTime] = useState( toDatetimeLocal(maestro.availableActivateDateTime) ); const [allowEditEnterCode, setAllowEditEnterCode] = useState( maestro.allowEditEnterCode ); const [errorMessage, setErrorMessage] = useState(""); const [successMessage, setSuccessMessage] = useState(""); const isDisabled = isSaving || isPending; async function handleSubmit(event: React.FormEvent) { event.preventDefault(); if (!window.confirm("마에스트로 정보를 저장하시겠습니까?")) return; setIsSaving(true); setErrorMessage(""); setSuccessMessage(""); try { const response = await fetch(`/api/maestros/${maestro.maestroID}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ name, email, activateStatus, accountType, availableActivateDateTime, allowEditEnterCode, }), }); const body = (await response.json().catch(() => null)) as { changed?: boolean; message?: string; } | null; if (!response.ok) { throw new Error(body?.message ?? "저장에 실패했습니다."); } if (body?.changed) { setSuccessMessage("저장 완료"); startTransition(() => { router.refresh(); }); } else { setSuccessMessage("변경 사항이 없습니다."); } } catch (error) { setErrorMessage( error instanceof Error ? error.message : "저장에 실패했습니다." ); } finally { setIsSaving(false); } } return (
void handleSubmit(e)} className="mt-4 space-y-5">
setName(e.target.value)} required type="text" value={name} /> setEmail(e.target.value)} required type="email" value={email} /> setAvailableActivateDateTime(e.target.value)} required type="datetime-local" value={availableActivateDateTime} />
{successMessage ? (

{successMessage}

) : null} {errorMessage ? (

{errorMessage}

) : null}
); } function FormField({ label, children, }: { label: string; children: React.ReactNode; }) { return ( ); } function ReadOnlyItem({ label, value }: { label: string; value: string }) { return (
{label}
{value}
); }