mirror of
https://github.com/langgenius/dify.git
synced 2024-11-16 03:32:23 +08:00
52 lines
1.2 KiB
TypeScript
52 lines
1.2 KiB
TypeScript
import {
|
|
memo,
|
|
useEffect,
|
|
useRef,
|
|
} from 'react'
|
|
import { useClickAway } from 'ahooks'
|
|
import { useNodes } from 'reactflow'
|
|
import PanelOperatorPopup from './nodes/_base/components/panel-operator/panel-operator-popup'
|
|
import type { Node } from './types'
|
|
import { useStore } from './store'
|
|
import { usePanelInteractions } from './hooks'
|
|
|
|
const NodeContextmenu = () => {
|
|
const ref = useRef(null)
|
|
const nodes = useNodes()
|
|
const { handleNodeContextmenuCancel, handlePaneContextmenuCancel } = usePanelInteractions()
|
|
const nodeMenu = useStore(s => s.nodeMenu)
|
|
const currentNode = nodes.find(node => node.id === nodeMenu?.nodeId) as Node
|
|
|
|
useEffect(() => {
|
|
if (nodeMenu)
|
|
handlePaneContextmenuCancel()
|
|
}, [nodeMenu, handlePaneContextmenuCancel])
|
|
|
|
useClickAway(() => {
|
|
handleNodeContextmenuCancel()
|
|
}, ref)
|
|
|
|
if (!nodeMenu || !currentNode)
|
|
return null
|
|
|
|
return (
|
|
<div
|
|
className='absolute z-[9]'
|
|
style={{
|
|
left: nodeMenu.left,
|
|
top: nodeMenu.top,
|
|
}}
|
|
ref={ref}
|
|
>
|
|
<PanelOperatorPopup
|
|
id={currentNode.id}
|
|
data={currentNode.data}
|
|
onClosePopup={() => handleNodeContextmenuCancel()}
|
|
showHelpLink
|
|
/>
|
|
</div>
|
|
)
|
|
}
|
|
|
|
export default memo(NodeContextmenu)
|