import { cn } from '@langgenius/dify-ui/cn' import { ContextMenu, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuSeparator, } from '@langgenius/dify-ui/context-menu' import { memo, useCallback, useMemo, } from 'react' import { useTranslation } from 'react-i18next' import { useDSL, useIsChatMode, useNodesInteractions, usePanelInteractions, useWorkflowMoveMode, useWorkflowStartRun, } from './hooks' import AddBlock from './operator/add-block' import { useOperator } from './operator/hooks' import { ShortcutKbd } from './shortcuts/shortcut-kbd' import { useStore } from './store' const PanelContextmenu = () => { const { t } = useTranslation() const panelMenu = useStore(s => s.panelMenu) const clipboardElements = useStore(s => s.clipboardElements) const setShowImportDSLModal = useStore(s => s.setShowImportDSLModal) const pendingComment = useStore(s => s.pendingComment) const setCommentPlacing = useStore(s => s.setCommentPlacing) const setCommentQuickAdd = useStore(s => s.setCommentQuickAdd) const { handleNodesPaste } = useNodesInteractions() const { handlePaneContextmenuCancel } = usePanelInteractions() const { handleStartWorkflowRun, handleWorkflowStartRunInChatflow, } = useWorkflowStartRun() const { handleAddNote } = useOperator() const { isCommentModeAvailable } = useWorkflowMoveMode() const { exportCheck } = useDSL() const isChatMode = useIsChatMode() const panelMenuClientX = panelMenu?.clientX const panelMenuClientY = panelMenu?.clientY const anchor = useMemo(() => { if (panelMenuClientX === undefined || panelMenuClientY === undefined) return null return { getBoundingClientRect: () => DOMRect.fromRect({ width: 0, height: 0, x: panelMenuClientX, y: panelMenuClientY, }), } }, [panelMenuClientX, panelMenuClientY]) const renderAddBlockTrigger = useCallback(() => { return ( ) }, [t]) const handleRunAction = useCallback(() => { if (isChatMode) handleWorkflowStartRunInChatflow() else handleStartWorkflowRun() handlePaneContextmenuCancel() }, [isChatMode, handleWorkflowStartRunInChatflow, handleStartWorkflowRun, handlePaneContextmenuCancel]) if (!panelMenu || !anchor) return null return ( !open && handlePaneContextmenuCancel()} > { e.stopPropagation() handleAddNote() handlePaneContextmenuCancel() }} > {t('nodes.note.addNote', { ns: 'workflow' })} {isCommentModeAvailable && ( { e.stopPropagation() if (pendingComment) return setCommentQuickAdd(true) setCommentPlacing(true) handlePaneContextmenuCancel() }} > {t('comments.actions.addComment', { ns: 'workflow' })} )} {isChatMode ? t('common.debugAndPreview', { ns: 'workflow' }) : t('common.run', { ns: 'workflow' })} {!isChatMode && } { if (clipboardElements.length) { handleNodesPaste() handlePaneContextmenuCancel() } }} > {t('common.pasteHere', { ns: 'workflow' })} exportCheck?.()} > {t('export', { ns: 'app' })} setShowImportDSLModal(true)} > {t('importApp', { ns: 'app' })} ) } export default memo(PanelContextmenu)