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);