refactored useUpdateNodePositions to useMoveSelectedNodes

This commit is contained in:
peterkogo
2024-01-24 12:25:39 +01:00
parent c3104f1fbb
commit 5d3efa73a8
3 changed files with 20 additions and 23 deletions
@@ -14,7 +14,7 @@ import { useStore, useStoreApi } from '../../hooks/useStore';
import { Provider } from '../../contexts/NodeIdContext'; import { Provider } from '../../contexts/NodeIdContext';
import { ARIA_NODE_DESC_KEY } from '../A11yDescriptions'; import { ARIA_NODE_DESC_KEY } from '../A11yDescriptions';
import { useDrag } from '../../hooks/useDrag'; import { useDrag } from '../../hooks/useDrag';
import { useUpdateNodePositions } from '../../hooks/useUpdateNodePositions'; import { useMoveSelectedNodes } from '../../hooks/useMoveSelectedNodes';
import { handleNodeClick } from '../Nodes/utils'; import { handleNodeClick } from '../Nodes/utils';
import { arrowKeyDiffs, builtinNodeTypes } from './utils'; import { arrowKeyDiffs, builtinNodeTypes } from './utils';
import type { NodeWrapperProps } from '../../types'; import type { NodeWrapperProps } from '../../types';
@@ -79,7 +79,7 @@ export function NodeWrapper({
const prevTargetPosition = useRef(node.targetPosition); const prevTargetPosition = useRef(node.targetPosition);
const prevType = useRef(nodeType); const prevType = useRef(nodeType);
const updatePositions = useUpdateNodePositions(); const moveSelectedNodes = useMoveSelectedNodes();
useEffect(() => { useEffect(() => {
if (nodeRef.current && !node.hidden) { if (nodeRef.current && !node.hidden) {
@@ -188,10 +188,9 @@ export function NodeWrapper({
.toLowerCase()}. New position, x: ${~~positionAbsoluteX}, y: ${~~positionAbsoluteY}`, .toLowerCase()}. New position, x: ${~~positionAbsoluteX}, y: ${~~positionAbsoluteY}`,
}); });
updatePositions({ moveSelectedNodes({
x: arrowKeyDiffs[event.key].x, direction: arrowKeyDiffs[event.key],
y: arrowKeyDiffs[event.key].y, factor: event.shiftKey ? 4 : 1,
isShiftPressed: event.shiftKey,
}); });
} }
}; };
@@ -10,7 +10,7 @@ import { getNodesBounds } from '@xyflow/system';
import { useStore, useStoreApi } from '../../hooks/useStore'; import { useStore, useStoreApi } from '../../hooks/useStore';
import { useDrag } from '../../hooks/useDrag'; import { useDrag } from '../../hooks/useDrag';
import { useUpdateNodePositions } from '../../hooks/useUpdateNodePositions'; import { useMoveSelectedNodes } from '../../hooks/useMoveSelectedNodes';
import { arrowKeyDiffs } from '../NodeWrapper/utils'; import { arrowKeyDiffs } from '../NodeWrapper/utils';
import type { Node, ReactFlowState } from '../../types'; import type { Node, ReactFlowState } from '../../types';
@@ -35,7 +35,7 @@ const selector = (s: ReactFlowState) => {
export function NodesSelection({ onSelectionContextMenu, noPanClassName, disableKeyboardA11y }: NodesSelectionProps) { export function NodesSelection({ onSelectionContextMenu, noPanClassName, disableKeyboardA11y }: NodesSelectionProps) {
const store = useStoreApi(); const store = useStoreApi();
const { width, height, transformString, userSelectionActive } = useStore(selector, shallow); const { width, height, transformString, userSelectionActive } = useStore(selector, shallow);
const updatePositions = useUpdateNodePositions(); const moveSelectedNodes = useMoveSelectedNodes();
const nodeRef = useRef<HTMLDivElement>(null); const nodeRef = useRef<HTMLDivElement>(null);
@@ -64,10 +64,9 @@ export function NodesSelection({ onSelectionContextMenu, noPanClassName, disable
const onKeyDown = (event: KeyboardEvent) => { const onKeyDown = (event: KeyboardEvent) => {
if (Object.prototype.hasOwnProperty.call(arrowKeyDiffs, event.key)) { if (Object.prototype.hasOwnProperty.call(arrowKeyDiffs, event.key)) {
updatePositions({ moveSelectedNodes({
x: arrowKeyDiffs[event.key].x, direction: arrowKeyDiffs[event.key],
y: arrowKeyDiffs[event.key].y, factor: event.shiftKey ? 4 : 1,
isShiftPressed: event.shiftKey,
}); });
} }
}; };
@@ -1,32 +1,31 @@
import { useCallback } from 'react'; import { useCallback } from 'react';
import { calcNextPosition, snapPosition } from '@xyflow/system'; import { XYPosition, calcNextPosition, snapPosition } from '@xyflow/system';
import { Node } from '../types'; import { Node } from '../types';
import { useStoreApi } from '../hooks/useStore'; import { useStoreApi } from './useStore';
const selectedAndDraggable = (nodesDraggable: boolean) => (n: Node) => const selectedAndDraggable = (nodesDraggable: boolean) => (n: Node) =>
n.selected && (n.draggable || (nodesDraggable && typeof n.draggable === 'undefined')); n.selected && (n.draggable || (nodesDraggable && typeof n.draggable === 'undefined'));
/** /**
* Hook for updating node positions. * Hook for updating node positions with keyboard presses
* *
* @internal * @internal
* @returns function for updating node positions * @returns function for updating node positions
*/ */
export function useUpdateNodePositions() { export function useMoveSelectedNodes() {
const store = useStoreApi(); const store = useStoreApi();
const updatePositions = useCallback((params: { x: number; y: number; isShiftPressed: boolean }) => { const moveSelectedNodes = useCallback((params: { direction: XYPosition; factor: number }) => {
const { nodeExtent, nodes, snapToGrid, snapGrid, nodesDraggable, onError, updateNodePositions } = store.getState(); const { nodeExtent, nodes, snapToGrid, snapGrid, nodesDraggable, onError, updateNodePositions } = store.getState();
const selectedNodes = nodes.filter(selectedAndDraggable(nodesDraggable)); const selectedNodes = nodes.filter(selectedAndDraggable(nodesDraggable));
// by default a node moves 5px on each key press, or 20px if shift is pressed // by default a node moves 5px on each key press
// if snap grid is enabled, we use that for the velocity. // if snap grid is enabled, we use that for the velocity
const xVelo = snapToGrid ? snapGrid[0] : 5; const xVelo = snapToGrid ? snapGrid[0] : 5;
const yVelo = snapToGrid ? snapGrid[1] : 5; const yVelo = snapToGrid ? snapGrid[1] : 5;
const factor = params.isShiftPressed ? 4 : 1;
const xDiff = params.x * xVelo * factor; const xDiff = params.direction.x * xVelo * params.factor;
const yDiff = params.y * yVelo * factor; const yDiff = params.direction.y * yVelo * params.factor;
const nodeUpdates = selectedNodes.map((node) => { const nodeUpdates = selectedNodes.map((node) => {
if (node.computed?.positionAbsolute) { if (node.computed?.positionAbsolute) {
@@ -61,5 +60,5 @@ export function useUpdateNodePositions() {
updateNodePositions(nodeUpdates, true, false); updateNodePositions(nodeUpdates, true, false);
}, []); }, []);
return updatePositions; return moveSelectedNodes;
} }