@@ -26,6 +26,7 @@ import { useEventEmitterContextContext } from './models/event-emitter';
2626
2727import CustomNodeComponent from './components/CustomNode' ;
2828import { useStore , useStoreApi } from './hooks/useStore' ;
29+ import { useFlow } from './hooks/useFlow' ;
2930
3031import Operator from './operator' ;
3132import FlowProps from './types' ;
@@ -89,6 +90,8 @@ const XFlow: FC<FlowProps> = memo(props => {
8990 const [ openLogPanel , setOpenLogPanel ] = useState < boolean > ( true ) ;
9091 const { onNodeClick, onEdgeClick, zoomOnScroll = true , panOnScroll = false , preventScrolling = true } = props ;
9192 const nodeEditorRef = useRef ( null ) ;
93+ const { copyNode, pasteNodeSimple } = useFlow ( ) ;
94+ const { undo, redo } = useTemporalStore ( ) ;
9295
9396 useEffect ( ( ) => {
9497 zoomTo ( 0.8 ) ;
@@ -101,12 +104,27 @@ const XFlow: FC<FlowProps> = memo(props => {
101104 useEventListener ( 'keydown' , e => {
102105 if ( ( e . key === 'd' || e . key === 'D' ) && ( e . ctrlKey || e . metaKey ) )
103106 e . preventDefault ( ) ;
104- if ( ( e . key === 'z' || e . key === 'Z' ) && ( e . ctrlKey || e . metaKey ) )
107+ if ( ( e . key === 'z' || e . key === 'Z' ) && ( e . ctrlKey || e . metaKey ) ) {
105108 e . preventDefault ( ) ;
106- if ( ( e . key === 'y' || e . key === 'Y' ) && ( e . ctrlKey || e . metaKey ) )
109+ undo ( ) ;
110+ }
111+ if ( ( e . key === 'y' || e . key === 'Y' ) && ( e . ctrlKey || e . metaKey ) ) {
107112 e . preventDefault ( ) ;
113+ redo ( ) ;
114+ }
108115 if ( ( e . key === 's' || e . key === 'S' ) && ( e . ctrlKey || e . metaKey ) )
109116 e . preventDefault ( ) ;
117+ if ( ( e . key === 'c' || e . key === 'C' ) && ( e . ctrlKey || e . metaKey ) ) {
118+ const selectedNode = nodes ?. find ( node => node . selected ) ;
119+ if ( selectedNode ) {
120+ copyNode ( selectedNode . id ) ;
121+ e . preventDefault ( ) ;
122+ }
123+ }
124+ else if ( ( e . key === 'v' || e . key === 'V' ) && ( e . ctrlKey || e . metaKey ) ) {
125+ pasteNodeSimple ( ) ;
126+ e . preventDefault ( ) ;
127+ }
110128 } ) ;
111129
112130 useEventListener (
@@ -125,7 +143,8 @@ const XFlow: FC<FlowProps> = memo(props => {
125143 } ,
126144 {
127145 target : workflowContainerRef . current ,
128- enable : isAddingNode ,
146+ // enable: isAddingNode,
147+ enable : true , // 复制粘贴的时候需要监听鼠标位置
129148 }
130149 ) ;
131150
@@ -262,6 +281,9 @@ const XFlow: FC<FlowProps> = memo(props => {
262281 }
263282 setOpenLogPanel ( true ) ;
264283 } }
284+ onDelete = { ( delId ) => {
285+ setActiveNode ( null ) ; // 删除节点并关闭弹窗
286+ } }
265287 />
266288 ) ;
267289 } ,
@@ -366,7 +388,7 @@ const XFlow: FC<FlowProps> = memo(props => {
366388 }
367389 } }
368390 onNodesDelete = { ( ) => {
369- // setActiveNode(null);
391+ setActiveNode ( null ) ;
370392 } }
371393 onNodeClick = { ( event , node ) => {
372394 onNodeClick && onNodeClick ( event , node ) ;
0 commit comments