import { useEffect, useState } from "react"; import { useMutation, useQueryClient } from "@tanstack/react-query"; import type { NodeModel, TreeMethods } from "@minoru/react-dnd-treeview"; import { Button } from "@common/components/ui"; import { cn } from "@common/components/lib"; import { ENDPOINT } from "@/shared/config"; import { MenuApi } from "../api/menu-service"; import type { TreeMenu } from "../model/menu-interface"; import { EditableNode } from "./editable-node"; type MenuNodeProps = { node: NodeModel; depth: number; isOpen: boolean; isSelected: boolean; isAdditionalParent: boolean; treeMethods: TreeMethods | null; onToggle: (id: NodeModel["id"]) => void; onSelect: (node: NodeModel) => void; }; function MenuNode({ node, depth, isOpen, isSelected, isAdditionalParent, treeMethods, onToggle, onSelect, }: MenuNodeProps) { const { id, text, data } = node; const indent = depth * 10 + 5; const queryClient = useQueryClient(); const { mutateAsync: updateMenuName } = useMutation({ mutationFn: (nodeName: string) => { const encodedName = encodeURIComponent(nodeName); return MenuApi.updateMenuName(id as number, encodedName); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: [ENDPOINT.CMS_SERVICE.MENUS], }); }, }); const [editMode, setEditMode] = useState(false); const [nodeName, setNodeName] = useState(text); const handleToggle = () => onToggle(id); const handleSelect = () => onSelect(node); const handleSave = async () => { await updateMenuName(nodeName); setEditMode(false); }; const handleCancel = () => { setEditMode(false); setNodeName(text); }; useEffect(() => { if (isAdditionalParent) treeMethods?.open(id); }, [isAdditionalParent]); return (
{editMode ? ( setNodeName(e.target.value)} onSave={handleSave} onCancel={handleCancel} /> ) : ( <>
{data?.children?.length && ( { e.stopPropagation(); handleToggle(); }} /> )} {text}
)}
); } export { MenuNode };