import { memo } from 'react'; import { observer } from 'mobx-react'; import { Graph, isGraph } from '../types'; import styles from '../css/topology-components'; import { WithPanZoomProps } from '../behavior/usePanZoom'; import { WithAreaSelectionProps } from '../behavior/useAreaSelection'; import { WithDndDropProps } from '../behavior/useDndDrop'; import { WithSelectionProps } from '../behavior/useSelection'; import { WithContextMenuProps } from '../behavior/withContextMenu'; import useCombineRefs from '../utils/useCombineRefs'; import LayersProvider from './layers/LayersProvider'; import ElementWrapper from './ElementWrapper'; import { GraphElementProps } from './factories'; type GraphComponentProps = GraphElementProps & WithPanZoomProps & WithAreaSelectionProps & WithDndDropProps & WithSelectionProps & WithContextMenuProps; // This inner Component will prevent the re-rendering of all children when the transform changes const ElementChildren: React.FunctionComponent<{ element: Graph }> = observer(({ element }) => ( <> {element.getEdges().map((e) => ( ))} {element.getNodes().map((e) => ( ))} )); // This inner Component will prevent re-rendering layers when the transform changes const Inner: React.FunctionComponent<{ element: Graph }> = memo( observer(({ element }) => ( )) ); const GraphComponent: React.FunctionComponent = ({ element, panZoomRef, areaSelectionRef, dndDropRef, onSelect, onContextMenu, isAreaSelectDragging, areaSelectDragStart, areaSelectDragEnd }) => { const zoomRefs = useCombineRefs(panZoomRef, areaSelectionRef); if (!isGraph(element)) { return null; } const graphElement = element as Graph; const { x, y, width, height } = graphElement.getBounds(); return ( <> {isAreaSelectDragging && areaSelectDragStart && areaSelectDragEnd ? ( ) : null} ); }; export default observer(GraphComponent);