diff --git a/example/src/NodeTypesObjectChange/index.tsx b/example/src/NodeTypesObjectChange/index.tsx new file mode 100644 index 00000000..54b34fcc --- /dev/null +++ b/example/src/NodeTypesObjectChange/index.tsx @@ -0,0 +1,76 @@ +import React, { useState, CSSProperties, FC } from 'react'; + +import ReactFlow, { + addEdge, + Elements, + Position, + Connection, + Edge, + NodeProps, + NodeTypesType, +} from 'react-flow-renderer'; + +const initialElements: Elements = [ + { + id: '1', + sourcePosition: Position.Right, + type: 'input', + data: { label: 'Input' }, + position: { x: 0, y: 80 }, + }, + { + id: '2', + type: 'a', + sourcePosition: Position.Right, + targetPosition: Position.Left, + data: { label: 'A Node' }, + position: { x: 250, y: 0 }, + }, +]; + +const buttonStyle: CSSProperties = { position: 'absolute', right: 10, top: 30, zIndex: 4 }; + +const nodeStyles: CSSProperties = { padding: '10px 15px', border: '1px solid #ddd' }; + +const NodeA: FC = () => { + return
A
; +}; + +const NodeB: FC = () => { + return
B
; +}; + +type NodeTypesObject = { + [key: string]: NodeTypesType; +}; + +const nodeTypesObjects: NodeTypesObject = { + a: { + a: NodeA, + }, + b: { + b: NodeB, + }, +}; + +const NodeTypeChangeFlow = () => { + const [nodeTypesId, setNodeTypesId] = useState('a'); + const [elements, setElements] = useState(initialElements); + const onConnect = (params: Connection | Edge) => setElements((els) => addEdge(params, els)); + const changeType = () => setNodeTypesId((nt) => (nt === 'a' ? 'b' : 'a')); + + return ( + + + + ); +}; + +export default NodeTypeChangeFlow; diff --git a/example/src/index.tsx b/example/src/index.tsx index 017accad..70c617ce 100644 --- a/example/src/index.tsx +++ b/example/src/index.tsx @@ -15,6 +15,7 @@ import Hidden from './Hidden'; import EdgeTypes from './EdgeTypes'; import CustomConnectionLine from './CustomConnectionLine'; import NodeTypeChange from './NodeTypeChange'; +import NodeTypesObjectChange from './NodeTypesObjectChange'; import UpdatableEdge from './UpdatableEdge'; import UpdateNode from './UpdateNode'; import SaveRestore from './SaveRestore'; @@ -80,6 +81,10 @@ const routes = [ path: '/nodetype-change', component: NodeTypeChange, }, + { + path: '/nodetypesobject-change', + component: NodeTypesObjectChange, + }, { path: '/updatable-edge', component: UpdatableEdge, diff --git a/src/container/ReactFlow/index.tsx b/src/container/ReactFlow/index.tsx index 91a91115..809fef98 100644 --- a/src/container/ReactFlow/index.tsx +++ b/src/container/ReactFlow/index.tsx @@ -115,6 +115,8 @@ export interface ReactFlowProps extends Omit, 'on onEdgeMouseMove?: (event: MouseEvent, edge: Edge) => void; onEdgeMouseLeave?: (event: MouseEvent, edge: Edge) => void; edgeUpdaterRadius?: number; + nodeTypesId?: string; + edgeTypesId?: string; } const ReactFlow = ({ @@ -185,10 +187,12 @@ const ReactFlow = ({ onEdgeMouseMove, onEdgeMouseLeave, edgeUpdaterRadius = 10, + nodeTypesId = '1', + edgeTypesId = '1', ...rest }: ReactFlowProps) => { - const nodeTypesParsed = useMemo(() => createNodeTypes(nodeTypes), []); - const edgeTypesParsed = useMemo(() => createEdgeTypes(edgeTypes), []); + const nodeTypesParsed = useMemo(() => createNodeTypes(nodeTypes), [nodeTypesId]); + const edgeTypesParsed = useMemo(() => createEdgeTypes(edgeTypes), [edgeTypesId]); const reactFlowClasses = cc(['react-flow', className]); return (