import * as React from 'react' import * as ReactDOM from 'react-dom' import Draggable from 'react-draggable' import ResizeObserver from 'react-resize-observer' import { IConfig, ILink, INode, INodeInnerDefaultProps, IOnDragNode, IOnLinkCancel, IOnLinkComplete, IOnLinkMove, IOnLinkStart, IOnNodeClick, IOnNodeSizeChange, IOnPortPositionChange, IPortDefaultProps, IPortsDefaultProps, IPosition, ISelectedOrHovered, ISize, PortWrapper, } from '../../' import { INodeDefaultProps, NodeDefault } from './Node.default' export interface INodeWrapperProps { config: IConfig node: INode Component: React.FunctionComponent offset: IPosition selected: ISelectedOrHovered | undefined hovered: ISelectedOrHovered | undefined selectedLink: ILink | undefined hoveredLink: ILink | undefined isSelected: boolean NodeInner: React.FunctionComponent Ports: React.FunctionComponent Port: React.FunctionComponent onPortPositionChange: IOnPortPositionChange onLinkStart: IOnLinkStart onLinkMove: IOnLinkMove onLinkComplete: IOnLinkComplete onLinkCancel: IOnLinkCancel onDragNode: IOnDragNode onNodeClick: IOnNodeClick onNodeSizeChange: IOnNodeSizeChange } export const NodeWrapper = ({ config, node, onDragNode, onNodeClick, isSelected, Component = NodeDefault, onNodeSizeChange, NodeInner, Ports, Port, offset, selected, selectedLink, hovered, hoveredLink, onPortPositionChange, onLinkStart, onLinkMove, onLinkComplete, onLinkCancel, }: INodeWrapperProps) => { const [size, setSize] = React.useState({ width: 0, height: 0 }) const compRef = React.useRef(null) // TODO: probably should add an observer to track node component size changes React.useLayoutEffect(() => { const el = ReactDOM.findDOMNode(compRef.current) as HTMLInputElement if (el) { if (size.width !== el.offsetWidth || size.height !== el.offsetHeight) { const newSize = { width: el.offsetWidth, height: el.offsetHeight } setSize(newSize) onNodeSizeChange({ config, nodeId: node.id, size: newSize }) } } }, [node, compRef.current, size.width, size.height]) const children = ( <> { const newSize = { width: rect.width, height: rect.height } setSize(newSize) }} /> { Object.keys(node.ports).map((portId) => ( null : onLinkStart} onLinkMove={config.readonly ? () => null : onLinkMove} onLinkComplete={onLinkComplete} onLinkCancel={onLinkCancel} /> )) } ) return ( { // Stop propagation so the canvas does not move e.stopPropagation() }} onDrag={(event, data) => onDragNode({ config, event, data, id: node.id })} disabled={config.readonly} > { onNodeClick({ config, nodeId: node.id }) e.stopPropagation() }} isSelected={isSelected} node={node} /> ) }