"use client"; import { useForm } from "react-hook-form"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import type { MenuDomain, CreateMenuGroupInput, CreateGroupInput, CreateTopLevelMenuInput } from "../types"; type DialogType = "menu_group" | "group" | "top_level_menu"; interface AddNodeDialogProps { open: boolean; onOpenChange: (open: boolean) => void; type: DialogType; domain: MenuDomain; parentId?: number; // group 생성 시 필요 onSave: (data: CreateMenuGroupInput | CreateGroupInput | CreateTopLevelMenuInput) => Promise; } interface FormData { titleKo: string; titleEn: string; menuPath: string; } export function AddNodeDialog({ open, onOpenChange, type, domain, parentId, onSave, }: AddNodeDialogProps) { const { register, handleSubmit, reset, formState: { isSubmitting, errors }, } = useForm({ defaultValues: { titleKo: "", titleEn: "", menuPath: "", }, }); const getTitle = () => { switch (type) { case "menu_group": return "Add Menu Group"; case "group": return "Add Group"; case "top_level_menu": return "Add Top-Level Menu"; default: return "Add"; } }; const getDescription = () => { switch (type) { case "menu_group": return "A dropdown trigger displayed in the header navigation."; case "group": return "Groups menus within a menu group."; case "top_level_menu": return "A single link displayed in the header navigation."; default: return ""; } }; const onSubmit = async (data: FormData) => { let saveData: CreateMenuGroupInput | CreateGroupInput | CreateTopLevelMenuInput; if (type === "menu_group") { saveData = { titleKo: data.titleKo, titleEn: data.titleEn || undefined, }; } else if (type === "group" && parentId) { saveData = { parentId, titleKo: data.titleKo, titleEn: data.titleEn || undefined, }; } else if (type === "top_level_menu") { saveData = { titleKo: data.titleKo, titleEn: data.titleEn || undefined, menuPath: data.menuPath, }; } else { return; } await onSave(saveData); reset(); onOpenChange(false); }; const handleClose = () => { reset(); onOpenChange(false); }; return ( {getTitle()} {getDescription()}
{/* Korean Name */}
{errors.titleKo && (

{errors.titleKo.message}

)}
{/* English Name */}
{/* Menu Path for Top-Level Menu */} {type === "top_level_menu" && (
{errors.menuPath && (

{errors.menuPath.message}

)}

e.g., /{domain}/report, /{domain}/faq

)}
); }