refactor(wrapnode): get node from store in event handlers

This commit is contained in:
moklick
2022-01-28 15:02:52 +01:00
parent 7e915ad39f
commit c40a36fdb6
+56 -24
View File
@@ -71,39 +71,49 @@ export default (NodeComponent: ComponentType<NodeProps>) => {
[zIndex, xPos, yPos, hasPointerEvents, style] [zIndex, xPos, yPos, hasPointerEvents, style]
); );
const node = useMemo(() => ({ id, type, position: { x: xPos, y: yPos }, data }), [id, type, xPos, yPos, data]); const grid = useMemo(
const grid = useMemo(() => (snapToGrid ? snapGrid : [1, 1])! as [number, number], [snapToGrid, snapGrid]); () => (snapToGrid ? snapGrid : [1, 1])! as [number, number],
[snapToGrid, snapGrid?.[0], snapGrid?.[1]]
);
const onMouseEnterHandler = useCallback( const onMouseEnterHandler = useCallback(
(event: MouseEvent) => { (event: MouseEvent) => {
if (onMouseEnter && !dragging) { if (onMouseEnter && !dragging) {
const node = store.getState().nodeInternals.get(id)!;
onMouseEnter(event, node); onMouseEnter(event, node);
} }
}, },
[onMouseEnter, dragging, node] [onMouseEnter, dragging, id]
); );
const onMouseMoveHandler = useCallback( const onMouseMoveHandler = useCallback(
(event: MouseEvent) => { (event: MouseEvent) => {
if (onMouseMove && !dragging) { if (onMouseMove && !dragging) {
const node = store.getState().nodeInternals.get(id)!;
onMouseMove(event, node); onMouseMove(event, node);
} }
}, },
[onMouseMove, dragging, node] [onMouseMove, dragging, id]
); );
const onMouseLeaveHandler = useCallback( const onMouseLeaveHandler = useCallback(
(event: MouseEvent) => { (event: MouseEvent) => {
if (onMouseLeave && !dragging) { if (onMouseLeave && !dragging) {
const node = store.getState().nodeInternals.get(id)!;
onMouseLeave?.(event, node); onMouseLeave?.(event, node);
} }
}, },
[onMouseLeave, dragging, node] [onMouseLeave, dragging, id]
); );
const onContextMenuHandler = useCallback( const onContextMenuHandler = useCallback(
(event: MouseEvent) => onContextMenu?.(event, node), (event: MouseEvent) => {
[onContextMenu, node] if (onContextMenu) {
const node = store.getState().nodeInternals.get(id)!;
onContextMenu(event, node);
}
},
[onContextMenu, id]
); );
const onSelectNodeHandler = useCallback( const onSelectNodeHandler = useCallback(
@@ -113,75 +123,97 @@ export default (NodeComponent: ComponentType<NodeProps>) => {
store.setState({ nodesSelectionActive: false }); store.setState({ nodesSelectionActive: false });
if (!selected) { if (!selected) {
addSelectedNodes([node.id]); addSelectedNodes([id]);
} }
} }
onClick?.(event, node); if (onClick) {
const node = store.getState().nodeInternals.get(id)!;
onClick(event, node);
}
} }
}, },
[isSelectable, selected, isDraggable, onClick, node] [isSelectable, selected, isDraggable, onClick, id]
); );
const onDragStart = useCallback( const onDragStart = useCallback(
(event: DraggableEvent) => { (event: DraggableEvent) => {
onNodeDragStart?.(event as MouseEvent, node); if (onNodeDragStart) {
const node = store.getState().nodeInternals.get(id)!;
onNodeDragStart(event as MouseEvent, node);
}
if (selectNodesOnDrag && isSelectable) { if (selectNodesOnDrag && isSelectable) {
store.setState({ nodesSelectionActive: false }); store.setState({ nodesSelectionActive: false });
if (!selected) { if (!selected) {
addSelectedNodes([node.id]); addSelectedNodes([id]);
} }
} else if (!selectNodesOnDrag && !selected && isSelectable) { } else if (!selectNodesOnDrag && !selected && isSelectable) {
unselectNodesAndEdges(); unselectNodesAndEdges();
store.setState({ nodesSelectionActive: false }); store.setState({ nodesSelectionActive: false });
} }
}, },
[node, selected, selectNodesOnDrag, isSelectable, onNodeDragStart] [id, selected, selectNodesOnDrag, isSelectable, onNodeDragStart]
); );
const onDrag = useCallback( const onDrag = useCallback(
(event: DraggableEvent, draggableData: DraggableData) => { (event: DraggableEvent, draggableData: DraggableData) => {
node.position.x += draggableData.deltaX; if (onNodeDrag) {
node.position.y += draggableData.deltaY; const node = store.getState().nodeInternals.get(id)!;
// node.position.x += draggableData.deltaX;
// node.position.y += draggableData.deltaY;
onNodeDrag?.(event as MouseEvent, node); onNodeDrag(event as MouseEvent, node);
}
updateNodePosition({ id, dragging: true, diff: { x: draggableData.deltaX, y: draggableData.deltaY } }); updateNodePosition({ id, dragging: true, diff: { x: draggableData.deltaX, y: draggableData.deltaY } });
}, },
[id, node, onNodeDrag] [id, onNodeDrag]
); );
const onDragStop = useCallback( const onDragStop = useCallback(
(event: DraggableEvent) => { (event: DraggableEvent) => {
// onDragStop also gets called when user just clicks on a node. // onDragStop also gets called when user just clicks on a node.
// Because of that we set dragging to true inside the onDrag handler and handle the click here // Because of that we set dragging to true inside the onDrag handler and handle the click here
let node;
if (onClick || onNodeDragStop) {
node = store.getState().nodeInternals.get(id)!;
}
if (!dragging) { if (!dragging) {
if (isSelectable && !selectNodesOnDrag && !selected) { if (isSelectable && !selectNodesOnDrag && !selected) {
addSelectedNodes([node.id]); addSelectedNodes([id]);
} }
onClick?.(event as MouseEvent, node); if (onClick && node) {
onClick(event as MouseEvent, node);
}
return; return;
} }
updateNodePosition({ updateNodePosition({
id: node.id, id,
dragging: false, dragging: false,
}); });
onNodeDragStop?.(event as MouseEvent, node); if (onNodeDragStop && node) {
onNodeDragStop(event as MouseEvent, node);
}
}, },
[node, isSelectable, selectNodesOnDrag, onClick, onNodeDragStop, dragging, selected] [id, isSelectable, selectNodesOnDrag, onClick, onNodeDragStop, dragging, selected]
); );
const onNodeDoubleClickHandler = useCallback( const onNodeDoubleClickHandler = useCallback(
(event: MouseEvent) => { (event: MouseEvent) => {
onNodeDoubleClick?.(event, node); if (onNodeDoubleClick) {
const node = store.getState().nodeInternals.get(id)!;
onNodeDoubleClick(event, node);
}
}, },
[node, onNodeDoubleClick] [id, onNodeDoubleClick]
); );
useEffect(() => { useEffect(() => {