diff --git a/packages/react/src/components/ConnectionLine/index.tsx b/packages/react/src/components/ConnectionLine/index.tsx
index ee816622..a5f7e1e2 100644
--- a/packages/react/src/components/ConnectionLine/index.tsx
+++ b/packages/react/src/components/ConnectionLine/index.tsx
@@ -12,6 +12,7 @@ import {
import { useStore } from '../../hooks/useStore';
import { getSimpleBezierPath } from '../Edges/SimpleBezierEdge';
import type { ConnectionLineComponent, ReactFlowState } from '../../types';
+import { useConnection } from '../../hooks/useConnection';
type ConnectionLineWrapperProps = {
type: ConnectionLineType;
@@ -58,10 +59,7 @@ type ConnectionLineProps = {
};
const ConnectionLine = ({ style, type = ConnectionLineType.Bezier, CustomComponent, isValid }: ConnectionLineProps) => {
- const { inProgress, from, fromNode, fromHandle, fromPosition, to, toNode, toHandle, toPosition } = useStore(
- (s: ReactFlowState) => s.connection,
- shallow
- );
+ const { inProgress, from, fromNode, fromHandle, fromPosition, to, toNode, toHandle, toPosition } = useConnection();
if (!inProgress) {
return;
@@ -121,4 +119,4 @@ const ConnectionLine = ({ style, type = ConnectionLineType.Bezier, CustomCompone
return ;
};
-ConnectionLine.displayName = 'ConnectionLine';
\ No newline at end of file
+ConnectionLine.displayName = 'ConnectionLine';
diff --git a/packages/react/src/hooks/useConnection.ts b/packages/react/src/hooks/useConnection.ts
index 0756344e..8a4b377b 100644
--- a/packages/react/src/hooks/useConnection.ts
+++ b/packages/react/src/hooks/useConnection.ts
@@ -2,12 +2,13 @@ import { shallow } from 'zustand/shallow';
import { useStore } from './useStore';
import type { ReactFlowStore } from '../types/store';
-import { ConnectionState } from '@xyflow/system';
-
-const selector = (s: ReactFlowStore) => ({
- ...s.connection,
-});
+import { ConnectionState, pointToRendererPoint } from '@xyflow/system';
+const selector = (s: ReactFlowStore): ConnectionState => {
+ return s.connection.inProgress
+ ? { ...s.connection, to: pointToRendererPoint(s.connection.to, s.transform) }
+ : { ...s.connection };
+};
/**
* Hook for accessing the connection state.
*
diff --git a/packages/svelte/src/lib/store/index.ts b/packages/svelte/src/lib/store/index.ts
index 51677776..e1eea73f 100644
--- a/packages/svelte/src/lib/store/index.ts
+++ b/packages/svelte/src/lib/store/index.ts
@@ -1,5 +1,5 @@
import { getContext, setContext } from 'svelte';
-import { derived, get } from 'svelte/store';
+import { derived, get, writable } from 'svelte/store';
import {
createMarkerIds,
fitView as fitViewSystem,
@@ -9,6 +9,7 @@ import {
addEdge as addEdgeUtil,
initialConnection,
errorMessages,
+ pointToRendererPoint,
type UpdateNodePositions,
type InternalNodeUpdate,
type ViewportHelperFunctionOptions,
@@ -16,8 +17,8 @@ import {
type XYPosition,
type CoordinateExtent,
type UpdateConnection,
- type NodeOrigin,
- type ConnectionState
+ type ConnectionState,
+ type NodeOrigin
} from '@xyflow/system';
import type { EdgeTypes, NodeTypes, Node, Edge, FitViewOptions } from '$lib/types';
@@ -341,12 +342,13 @@ export function createStore({
});
}
+ const _connection = writable(initialConnection);
const updateConnection: UpdateConnection = (newConnection: ConnectionState) => {
- store.connection.set({ ...newConnection });
+ _connection.set({ ...newConnection });
};
function cancelConnection() {
- store.connection.set(initialConnection);
+ _connection.set(initialConnection);
}
function reset() {
@@ -367,6 +369,14 @@ export function createStore({
// derived state
visibleEdges: getVisibleEdges(store),
visibleNodes: getVisibleNodes(store),
+ connection: derived([_connection, store.viewport], ([connection, viewport]) => {
+ return connection.inProgress
+ ? {
+ ...connection,
+ to: pointToRendererPoint(connection.to, [viewport.x, viewport.y, viewport.zoom])
+ }
+ : { ...connection };
+ }),
markers: derived(
[store.edges, store.defaultMarkerColor, store.flowId],
([edges, defaultColor, id]) => createMarkerIds(edges, { defaultColor, id })
diff --git a/packages/svelte/src/lib/store/initial-store.ts b/packages/svelte/src/lib/store/initial-store.ts
index 321b75a8..5c9b9f64 100644
--- a/packages/svelte/src/lib/store/initial-store.ts
+++ b/packages/svelte/src/lib/store/initial-store.ts
@@ -144,7 +144,7 @@ export const getInitialStore = ({
viewport: writable(viewport),
connectionMode: writable(ConnectionMode.Strict),
domNode: writable(null),
- connection: writable(initialConnection),
+ connection: readable(initialConnection),
connectionLineType: writable(ConnectionLineType.Bezier),
connectionRadius: writable(20),
isValidConnection: writable(() => true),
diff --git a/packages/system/src/xyhandle/XYHandle.ts b/packages/system/src/xyhandle/XYHandle.ts
index 7244d8d3..4ecf0cce 100644
--- a/packages/system/src/xyhandle/XYHandle.ts
+++ b/packages/system/src/xyhandle/XYHandle.ts
@@ -1,4 +1,11 @@
-import { pointToRendererPoint, getHostForElement, calcAutoPan, getEventPosition, getHandlePosition } from '../utils';
+import {
+ pointToRendererPoint,
+ getHostForElement,
+ calcAutoPan,
+ getEventPosition,
+ getHandlePosition,
+ rendererPointToPoint,
+} from '../utils';
import {
ConnectionMode,
Position,
@@ -98,7 +105,7 @@ function onPointerDown(
fromPosition: fromHandle.position,
fromNode: fromNodeInternal.internals.userNode,
- to: pointToRendererPoint(position, getTransform()),
+ to: position,
toHandle: null,
toPosition: oppositePosition[fromHandle.position],
toNode: null,
@@ -151,8 +158,8 @@ function onPointerDown(
isValid,
to:
closestHandle && isValid
- ? { x: closestHandle.x, y: closestHandle.y }
- : pointToRendererPoint(position, transform),
+ ? rendererPointToPoint({ x: closestHandle.x, y: closestHandle.y }, transform)
+ : position,
toHandle: result.toHandle,
toPosition: isValid && result.toHandle ? result.toHandle.position : oppositePosition[fromHandle.position],
toNode: result.toHandle ? nodeLookup.get(result.toHandle.nodeId)!.internals.userNode : null,