chore(handle): cleanup

This commit is contained in:
moklick
2025-08-12 13:16:56 +02:00
parent f18e98569b
commit 295884fea9
8 changed files with 33 additions and 20 deletions
+1
View File
@@ -1,6 +1,7 @@
--- ---
'@xyflow/react': patch '@xyflow/react': patch
'@xyflow/system': patch '@xyflow/system': patch
'@xyflow/svelte': patch
--- ---
Fix clicking on detached handle elements not initiating drawing of connections Fix clicking on detached handle elements not initiating drawing of connections
@@ -1,4 +1,13 @@
import { ReactFlow, Node, ReactFlowProvider, Background, BackgroundVariant, NodeProps, Handle, Position } from '@xyflow/react'; import {
ReactFlow,
Node,
ReactFlowProvider,
Background,
BackgroundVariant,
NodeProps,
Handle,
Position,
} from '@xyflow/react';
import './style.css'; import './style.css';
@@ -38,7 +47,7 @@ const nodeTypes = {
const DetachedHandle = () => { const DetachedHandle = () => {
return ( return (
<ReactFlow defaultNodes={initialNodes} nodeTypes={nodeTypes} fitView> <ReactFlow defaultNodes={initialNodes} defaultEdges={[]} connectionRadius={10} nodeTypes={nodeTypes} fitView>
<Background variant={BackgroundVariant.Lines} /> <Background variant={BackgroundVariant.Lines} />
</ReactFlow> </ReactFlow>
); );
@@ -1,11 +1,11 @@
// Reconnectable edges have a anchors around their handles to reconnect the edge. // Reconnectable edges have a anchors around their handles to reconnect the edge.
import { import {
XYHandle, XYHandle,
type EdgePosition,
type FinalConnectionState,
type HandleType,
type OnConnectStart,
type Connection, type Connection,
EdgePosition,
FinalConnectionState,
HandleType,
OnConnectStart,
} from '@xyflow/system'; } from '@xyflow/system';
import { EdgeAnchor } from '../Edges/EdgeAnchor'; import { EdgeAnchor } from '../Edges/EdgeAnchor';
@@ -79,7 +79,7 @@ export function EdgeUpdateAnchors<EdgeType extends Edge = Edge>({
onConnectStart?.(_event, params); onConnectStart?.(_event, params);
}; };
XYHandle.onPointerDown(event.nativeEvent, event.currentTarget, { XYHandle.onPointerDown(event.nativeEvent, {
autoPanOnConnect, autoPanOnConnect,
connectionMode, connectionMode,
connectionRadius, connectionRadius,
@@ -102,6 +102,7 @@ export function EdgeUpdateAnchors<EdgeType extends Edge = Edge>({
getTransform: () => store.getState().transform, getTransform: () => store.getState().transform,
getFromHandle: () => store.getState().connection.fromHandle, getFromHandle: () => store.getState().connection.fromHandle,
dragThreshold: store.getState().connectionDragThreshold, dragThreshold: store.getState().connectionDragThreshold,
handleDomNode: event.currentTarget,
}); });
}; };
@@ -114,13 +114,11 @@ function HandleComponent(
onConnectAction?.(edgeParams); onConnectAction?.(edgeParams);
onConnect?.(edgeParams); onConnect?.(edgeParams);
}; };
const onPointerDown = (event: ReactMouseEvent<HTMLDivElement> | ReactTouchEvent<HTMLDivElement>) => { const onPointerDown = (event: ReactMouseEvent<HTMLDivElement> | ReactTouchEvent<HTMLDivElement>) => {
if (!nodeId) { if (!nodeId) {
return; return;
} }
const handleElement = event.currentTarget
const isMouseTriggered = isMouseEvent(event.nativeEvent); const isMouseTriggered = isMouseEvent(event.nativeEvent);
if ( if (
@@ -129,7 +127,8 @@ function HandleComponent(
) { ) {
const currentStore = store.getState(); const currentStore = store.getState();
XYHandle.onPointerDown(event.nativeEvent, handleElement, { XYHandle.onPointerDown(event.nativeEvent, {
handleDomNode: event.currentTarget,
autoPanOnConnect: currentStore.autoPanOnConnect, autoPanOnConnect: currentStore.autoPanOnConnect,
connectionMode: currentStore.connectionMode, connectionMode: currentStore.connectionMode,
connectionRadius: currentStore.connectionRadius, connectionRadius: currentStore.connectionRadius,
@@ -102,7 +102,8 @@
updateConnection, updateConnection,
getTransform: () => [store.viewport.x, store.viewport.y, store.viewport.zoom], getTransform: () => [store.viewport.x, store.viewport.y, store.viewport.zoom],
getFromHandle: () => store.connection.fromHandle, getFromHandle: () => store.connection.fromHandle,
dragThreshold: dragThreshold ?? store.connectionDragThreshold dragThreshold: dragThreshold ?? store.connectionDragThreshold,
handleDomNode: event.currentTarget as HTMLElement
}); });
}; };
</script> </script>
@@ -111,7 +111,7 @@
function onpointerdown(event: MouseEvent | TouchEvent) { function onpointerdown(event: MouseEvent | TouchEvent) {
const isMouseTriggered = isMouseEvent(event); const isMouseTriggered = isMouseEvent(event);
if ((isMouseTriggered && event.button === 0) || !isMouseTriggered) { if (event.currentTarget && ((isMouseTriggered && event.button === 0) || !isMouseTriggered)) {
XYHandle.onPointerDown(event, { XYHandle.onPointerDown(event, {
handleId, handleId,
nodeId, nodeId,
@@ -140,7 +140,8 @@
}, },
getTransform: () => [store.viewport.x, store.viewport.y, store.viewport.zoom], getTransform: () => [store.viewport.x, store.viewport.y, store.viewport.zoom],
getFromHandle: () => store.connection.fromHandle, getFromHandle: () => store.connection.fromHandle,
dragThreshold: store.connectionDragThreshold dragThreshold: store.connectionDragThreshold,
handleDomNode: event.currentTarget as HTMLElement
}); });
} }
} }
+6 -6
View File
@@ -22,7 +22,6 @@ const alwaysValid = () => true;
function onPointerDown( function onPointerDown(
event: MouseEvent | TouchEvent, event: MouseEvent | TouchEvent,
handleElement: Element,
{ {
connectionMode, connectionMode,
connectionRadius, connectionRadius,
@@ -47,6 +46,7 @@ function onPointerDown(
getFromHandle, getFromHandle,
autoPanSpeed, autoPanSpeed,
dragThreshold = 1, dragThreshold = 1,
handleDomNode,
}: OnPointerDownParams }: OnPointerDownParams
) { ) {
// when xyflow is used inside a shadow root we can't use document // when xyflow is used inside a shadow root we can't use document
@@ -55,7 +55,7 @@ function onPointerDown(
let closestHandle: Handle | null; let closestHandle: Handle | null;
const { x, y } = getEventPosition(event); const { x, y } = getEventPosition(event);
const handleType = getHandleType(edgeUpdaterType, handleElement); const handleType = getHandleType(edgeUpdaterType, handleDomNode);
const containerBounds = domNode?.getBoundingClientRect(); const containerBounds = domNode?.getBoundingClientRect();
let connectionStarted = false; let connectionStarted = false;
@@ -72,7 +72,7 @@ function onPointerDown(
let autoPanStarted = false; let autoPanStarted = false;
let connection: Connection | null = null; let connection: Connection | null = null;
let isValid: boolean | null = false; let isValid: boolean | null = false;
let handleDomNode: Element | null = null; let resultHandleDomNode: Element | null = null;
// when the user is moving the mouse close to the edge of the canvas while connecting we move the canvas // when the user is moving the mouse close to the edge of the canvas while connecting we move the canvas
function autoPan(): void { function autoPan(): void {
@@ -167,7 +167,7 @@ function onPointerDown(
nodeLookup, nodeLookup,
}); });
handleDomNode = result.handleDomNode; resultHandleDomNode = result.handleDomNode;
connection = result.connection; connection = result.connection;
isValid = isConnectionValid(!!closestHandle, result.isValid); isValid = isConnectionValid(!!closestHandle, result.isValid);
@@ -208,7 +208,7 @@ function onPointerDown(
function onPointerUp(event: MouseEvent | TouchEvent) { function onPointerUp(event: MouseEvent | TouchEvent) {
if (connectionStarted) { if (connectionStarted) {
if ((closestHandle || handleDomNode) && connection && isValid) { if ((closestHandle || resultHandleDomNode) && connection && isValid) {
onConnect?.(connection); onConnect?.(connection);
} }
@@ -235,7 +235,7 @@ function onPointerDown(
autoPanStarted = false; autoPanStarted = false;
isValid = false; isValid = false;
connection = null; connection = null;
handleDomNode = null; resultHandleDomNode = null;
doc.removeEventListener('mousemove', onPointerMove as EventListener); doc.removeEventListener('mousemove', onPointerMove as EventListener);
doc.removeEventListener('mouseup', onPointerUp as EventListener); doc.removeEventListener('mouseup', onPointerUp as EventListener);
+2 -1
View File
@@ -38,6 +38,7 @@ export type OnPointerDownParams = {
getFromHandle: () => Handle | null; getFromHandle: () => Handle | null;
autoPanSpeed?: number; autoPanSpeed?: number;
dragThreshold?: number; dragThreshold?: number;
handleDomNode: Element;
}; };
export type IsValidParams = { export type IsValidParams = {
@@ -54,7 +55,7 @@ export type IsValidParams = {
}; };
export type XYHandleInstance = { export type XYHandleInstance = {
onPointerDown: (event: MouseEvent | TouchEvent, handleElement: Element, params: OnPointerDownParams) => void; onPointerDown: (event: MouseEvent | TouchEvent, params: OnPointerDownParams) => void;
isValid: (event: MouseEvent | TouchEvent, params: IsValidParams) => Result; isValid: (event: MouseEvent | TouchEvent, params: IsValidParams) => Result;
}; };