|
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) |
|
|