import { useState } from "react"; import type { NodeModel } from "@minoru/react-dnd-treeview"; import type { UseFieldArrayReturn } from "react-hook-form"; import { Button, Checkbox, cn } from "@common/components"; import { type TreeMenu } from "@/entities/tree-menu"; import type { SiteMapFormData, SiteMapPayloadData } from "@/entities/menu"; import { EditableNode } from "./editable-node"; type MenuNodeProps = { node: NodeModel; depth: number; isOpen: boolean; fieldArray: UseFieldArrayReturn; onToggle: (id: NodeModel["id"]) => void; }; function MenuNode({ node, depth, isOpen, fieldArray, onToggle, }: MenuNodeProps) { const { id, text, data } = node; const indent = depth * 10 + 5; const [editMode, setEditMode] = useState(false); const [nodeName, setNodeName] = useState(text); const [otptYn, setOtptYn] = useState(data?.otptYn ?? "N"); const updateField = (id: number, newField: SiteMapPayloadData) => { const existingFieldIndex = fieldArray.fields.findIndex( (field) => field.menuCd === id, ); if (existingFieldIndex !== -1) { fieldArray.update(existingFieldIndex, newField); } else { fieldArray.append(newField); } }; const handleToggle = () => onToggle(id); const handleSave = async () => { const newField = { menuCd: id as number, menuSubKornNm: nodeName, otptYn, }; updateField(id as number, newField); setEditMode(false); }; const handleCancel = () => { setEditMode(false); setNodeName(text); }; const handleOtptYnChange = (checked: boolean) => { const newField = { menuCd: id as number, menuSubKornNm: nodeName, otptYn: checked ? "Y" : "N", }; updateField(id as number, newField); setOtptYn(checked ? "Y" : "N"); }; return (
{ e.stopPropagation(); handleToggle(); }} > {editMode ? ( setNodeName(e.target.value)} onSave={handleSave} onCancel={handleCancel} /> ) : (
{data?.children?.length && ( )} {nodeName}
)} { e.stopPropagation(); }} onCheckedChange={handleOtptYnChange} />
); } export { MenuNode };