You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.tsx 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { useCallback } from 'react';
  2. import ReactFlow, {
  3. Background,
  4. Controls,
  5. MarkerType,
  6. NodeMouseHandler,
  7. } from 'reactflow';
  8. import 'reactflow/dist/style.css';
  9. import { NodeContextMenu, useHandleNodeContextMenu } from './context-menu';
  10. import { ButtonEdge } from './edge';
  11. import FlowDrawer from '../flow-drawer';
  12. import {
  13. useHandleDrop,
  14. useHandleKeyUp,
  15. useSelectCanvasData,
  16. useShowDrawer,
  17. } from '../hooks';
  18. import { TextUpdaterNode } from './node';
  19. import styles from './index.less';
  20. const nodeTypes = { textUpdater: TextUpdaterNode };
  21. const edgeTypes = {
  22. buttonEdge: ButtonEdge,
  23. };
  24. interface IProps {
  25. sideWidth: number;
  26. }
  27. function FlowCanvas({ sideWidth }: IProps) {
  28. const {
  29. nodes,
  30. edges,
  31. onConnect,
  32. onEdgesChange,
  33. onNodesChange,
  34. onSelectionChange,
  35. } = useSelectCanvasData();
  36. const { ref, menu, onNodeContextMenu, onPaneClick } =
  37. useHandleNodeContextMenu(sideWidth);
  38. const { drawerVisible, hideDrawer, showDrawer, clickedNode } =
  39. useShowDrawer();
  40. const onNodeClick: NodeMouseHandler = useCallback(
  41. (e, node) => {
  42. showDrawer(node);
  43. },
  44. [showDrawer],
  45. );
  46. const { onDrop, onDragOver, setReactFlowInstance } = useHandleDrop();
  47. const { handleKeyUp } = useHandleKeyUp();
  48. return (
  49. <div className={styles.canvasWrapper}>
  50. <ReactFlow
  51. ref={ref}
  52. nodes={nodes}
  53. onNodesChange={onNodesChange}
  54. onNodeContextMenu={onNodeContextMenu}
  55. edges={edges}
  56. onEdgesChange={onEdgesChange}
  57. fitView
  58. onConnect={onConnect}
  59. nodeTypes={nodeTypes}
  60. edgeTypes={edgeTypes}
  61. onPaneClick={onPaneClick}
  62. onDrop={onDrop}
  63. onDragOver={onDragOver}
  64. onNodeClick={onNodeClick}
  65. onInit={setReactFlowInstance}
  66. onKeyUp={handleKeyUp}
  67. onSelectionChange={onSelectionChange}
  68. nodeOrigin={[0.5, 0]}
  69. onChange={(...params) => {
  70. console.info('params:', ...params);
  71. }}
  72. defaultEdgeOptions={{
  73. type: 'buttonEdge',
  74. markerEnd: {
  75. type: MarkerType.ArrowClosed,
  76. },
  77. }}
  78. >
  79. <Background />
  80. <Controls />
  81. {Object.keys(menu).length > 0 && (
  82. <NodeContextMenu onClick={onPaneClick} {...(menu as any)} />
  83. )}
  84. </ReactFlow>
  85. <FlowDrawer
  86. node={clickedNode}
  87. visible={drawerVisible}
  88. hideModal={hideDrawer}
  89. ></FlowDrawer>
  90. </div>
  91. );
  92. }
  93. export default FlowCanvas;