import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from '@/components/ui/accordion'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { Tooltip, TooltipContent, TooltipTrigger, } from '@/components/ui/tooltip'; import { IModalProps } from '@/interfaces/common'; import { Operator } from '@/pages/agent/constant'; import { AgentInstanceContext, HandleContext } from '@/pages/agent/context'; import OperatorIcon from '@/pages/agent/operator-icon'; import { Position } from '@xyflow/react'; import { lowerFirst } from 'lodash'; import { PropsWithChildren, createContext, memo, useContext, useEffect, useRef, } from 'react'; import { useTranslation } from 'react-i18next'; type OperatorItemProps = { operators: Operator[]; isCustomDropdown?: boolean; mousePosition?: { x: number; y: number }; }; const HideModalContext = createContext['showModal']>(() => {}); const OnNodeCreatedContext = createContext< ((newNodeId: string) => void) | undefined >(undefined); function OperatorItemList({ operators, isCustomDropdown = false, mousePosition, }: OperatorItemProps) { const { addCanvasNode } = useContext(AgentInstanceContext); const handleContext = useContext(HandleContext); const hideModal = useContext(HideModalContext); const onNodeCreated = useContext(OnNodeCreatedContext); const { t } = useTranslation(); const handleClick = (operator: Operator) => { const contextData = handleContext || { nodeId: '', id: '', type: 'source' as const, position: Position.Right, isFromConnectionDrag: true, }; const mockEvent = mousePosition ? { clientX: mousePosition.x, clientY: mousePosition.y, } : undefined; const newNodeId = addCanvasNode(operator, contextData)(mockEvent); if (onNodeCreated && newNodeId) { onNodeCreated(newNodeId); } hideModal?.(); }; const renderOperatorItem = (operator: Operator) => { const commonContent = (
{t(`flow.${lowerFirst(operator)}`)}
); return ( {isCustomDropdown ? (
  • handleClick(operator)}>{commonContent}
  • ) : ( handleClick(operator)} onSelect={() => hideModal?.()} > {t(`flow.${lowerFirst(operator)}`)} )}

    {t(`flow.${lowerFirst(operator)}Description`)}

    ); }; return ; } function AccordionOperators({ isCustomDropdown = false, mousePosition, }: { isCustomDropdown?: boolean; mousePosition?: { x: number; y: number }; }) { return ( Foundation Dialogue Flow Data Manipulation Tools ); } export function InnerNextStepDropdown({ children, hideModal, position, onNodeCreated, }: PropsWithChildren & IModalProps & { position?: { x: number; y: number }; onNodeCreated?: (newNodeId: string) => void; }) { const dropdownRef = useRef(null); useEffect(() => { if (position && hideModal) { const handleKeyDown = (event: KeyboardEvent) => { if (event.key === 'Escape') { hideModal(); } }; document.addEventListener('keydown', handleKeyDown); return () => { document.removeEventListener('keydown', handleKeyDown); }; } }, [position, hideModal]); if (position) { return (
    e.stopPropagation()} >
    Next Step
    ); } return ( { if (!open && hideModal) { hideModal(); } }} > {children} e.stopPropagation()} className="w-[300px] font-semibold" > Next Step ); } export const NextStepDropdown = memo(InnerNextStepDropdown);