Spaces:
Build error
Build error
import { | |
memo, | |
useEffect, | |
useRef, | |
} from 'react' | |
import { useTranslation } from 'react-i18next' | |
import { useClickAway } from 'ahooks' | |
import ShortcutsName from './shortcuts-name' | |
import { useStore } from './store' | |
import { | |
useDSL, | |
useNodesInteractions, | |
usePanelInteractions, | |
useWorkflowStartRun, | |
} from './hooks' | |
import AddBlock from './operator/add-block' | |
import { useOperator } from './operator/hooks' | |
import cn from '@/utils/classnames' | |
const PanelContextmenu = () => { | |
const { t } = useTranslation() | |
const ref = useRef(null) | |
const panelMenu = useStore(s => s.panelMenu) | |
const clipboardElements = useStore(s => s.clipboardElements) | |
const setShowImportDSLModal = useStore(s => s.setShowImportDSLModal) | |
const { handleNodesPaste } = useNodesInteractions() | |
const { handlePaneContextmenuCancel, handleNodeContextmenuCancel } = usePanelInteractions() | |
const { handleStartWorkflowRun } = useWorkflowStartRun() | |
const { handleAddNote } = useOperator() | |
const { exportCheck } = useDSL() | |
useEffect(() => { | |
if (panelMenu) | |
handleNodeContextmenuCancel() | |
}, [panelMenu, handleNodeContextmenuCancel]) | |
useClickAway(() => { | |
handlePaneContextmenuCancel() | |
}, ref) | |
const renderTrigger = () => { | |
return ( | |
<div | |
className='flex items-center justify-between px-3 h-8 text-sm text-gray-700 rounded-lg cursor-pointer hover:bg-gray-50' | |
> | |
{t('workflow.common.addBlock')} | |
</div> | |
) | |
} | |
if (!panelMenu) | |
return null | |
return ( | |
<div | |
className='absolute w-[200px] rounded-lg border-[0.5px] border-gray-200 bg-white shadow-xl z-[9]' | |
style={{ | |
left: panelMenu.left, | |
top: panelMenu.top, | |
}} | |
ref={ref} | |
> | |
<div className='p-1'> | |
<AddBlock | |
renderTrigger={renderTrigger} | |
offset={{ | |
mainAxis: -36, | |
crossAxis: -4, | |
}} | |
/> | |
<div | |
className='flex items-center justify-between px-3 h-8 text-sm text-gray-700 rounded-lg cursor-pointer hover:bg-gray-50' | |
onClick={(e) => { | |
e.stopPropagation() | |
handleAddNote() | |
handlePaneContextmenuCancel() | |
}} | |
> | |
{t('workflow.nodes.note.addNote')} | |
</div> | |
<div | |
className='flex items-center justify-between px-3 h-8 text-sm text-gray-700 rounded-lg cursor-pointer hover:bg-gray-50' | |
onClick={() => { | |
handleStartWorkflowRun() | |
handlePaneContextmenuCancel() | |
}} | |
> | |
{t('workflow.common.run')} | |
<ShortcutsName keys={['alt', 'r']} /> | |
</div> | |
</div> | |
<div className='h-[1px] bg-gray-100'></div> | |
<div className='p-1'> | |
<div | |
className={cn( | |
'flex items-center justify-between px-3 h-8 text-sm text-gray-700 rounded-lg cursor-pointer', | |
!clipboardElements.length ? 'opacity-50 cursor-not-allowed' : 'hover:bg-gray-50', | |
)} | |
onClick={() => { | |
if (clipboardElements.length) { | |
handleNodesPaste() | |
handlePaneContextmenuCancel() | |
} | |
}} | |
> | |
{t('workflow.common.pasteHere')} | |
<ShortcutsName keys={['ctrl', 'v']} /> | |
</div> | |
</div> | |
<div className='h-[1px] bg-gray-100'></div> | |
<div className='p-1'> | |
<div | |
className='flex items-center justify-between px-3 h-8 text-sm text-gray-700 rounded-lg cursor-pointer hover:bg-gray-50' | |
onClick={() => exportCheck()} | |
> | |
{t('app.export')} | |
</div> | |
<div | |
className='flex items-center justify-between px-3 h-8 text-sm text-gray-700 rounded-lg cursor-pointer hover:bg-gray-50' | |
onClick={() => setShowImportDSLModal(true)} | |
> | |
{t('workflow.common.importDSL')} | |
</div> | |
</div> | |
</div> | |
) | |
} | |
export default memo(PanelContextmenu) | |