refactor(handles): check if inside a shadow root

This commit is contained in:
moklick
2021-03-29 13:46:41 +02:00
parent c63992e3ff
commit 2eea1c34a1
2 changed files with 24 additions and 9 deletions
+21 -9
View File
@@ -1,5 +1,7 @@
import { MouseEvent as ReactMouseEvent } from 'react'; import { MouseEvent as ReactMouseEvent } from 'react';
import { getHostForElement } from '../../utils';
import { import {
ElementId, ElementId,
XYPosition, XYPosition,
@@ -31,9 +33,10 @@ function checkElementBelowIsValid(
isTarget: boolean, isTarget: boolean,
nodeId: ElementId, nodeId: ElementId,
handleId: ElementId | null, handleId: ElementId | null,
isValidConnection: ValidConnectionFunc isValidConnection: ValidConnectionFunc,
doc: Document | ShadowRoot
) { ) {
const elementBelow = document.elementFromPoint(event.clientX, event.clientY); const elementBelow = doc.elementFromPoint(event.clientX, event.clientY);
const elementBelowIsTarget = elementBelow?.classList.contains('target') || false; const elementBelowIsTarget = elementBelow?.classList.contains('target') || false;
const elementBelowIsSource = elementBelow?.classList.contains('source') || false; const elementBelowIsSource = elementBelow?.classList.contains('source') || false;
@@ -98,7 +101,14 @@ export function onMouseDown(
onConnectEnd?: OnConnectEndFunc onConnectEnd?: OnConnectEndFunc
): void { ): void {
const reactFlowNode = (event.target as Element).closest('.react-flow'); const reactFlowNode = (event.target as Element).closest('.react-flow');
const elementBelow = document.elementFromPoint(event.clientX, event.clientY); // when react-flow is used inside a shadow root we can't use document
const doc = getHostForElement(event.target as HTMLElement);
if (!doc) {
return;
}
const elementBelow = doc.elementFromPoint(event.clientX, event.clientY);
const elementBelowIsTarget = elementBelow?.classList.contains('target'); const elementBelowIsTarget = elementBelow?.classList.contains('target');
const elementBelowIsSource = elementBelow?.classList.contains('source'); const elementBelowIsSource = elementBelow?.classList.contains('source');
const elementBelowIsUpdater = elementBelow?.classList.contains('react-flow__edgeupdater'); const elementBelowIsUpdater = elementBelow?.classList.contains('react-flow__edgeupdater');
@@ -131,7 +141,8 @@ export function onMouseDown(
isTarget, isTarget,
nodeId, nodeId,
handleId, handleId,
isValidConnection isValidConnection,
doc
); );
if (!isHoveringHandle) { if (!isHoveringHandle) {
@@ -154,7 +165,8 @@ export function onMouseDown(
isTarget, isTarget,
nodeId, nodeId,
handleId, handleId,
isValidConnection isValidConnection,
doc
); );
onConnectStop?.(event); onConnectStop?.(event);
@@ -168,10 +180,10 @@ export function onMouseDown(
resetRecentHandle(recentHoveredHandle); resetRecentHandle(recentHoveredHandle);
setConnectionNodeId({ connectionNodeId: null, connectionHandleId: null, connectionHandleType: null }); setConnectionNodeId({ connectionNodeId: null, connectionHandleId: null, connectionHandleType: null });
document.removeEventListener('mousemove', onMouseMove); doc.removeEventListener('mousemove', onMouseMove as EventListenerOrEventListenerObject);
document.removeEventListener('mouseup', onMouseUp); doc.removeEventListener('mouseup', onMouseUp as EventListenerOrEventListenerObject);
} }
document.addEventListener('mousemove', onMouseMove); doc.addEventListener('mousemove', onMouseMove as EventListenerOrEventListenerObject);
document.addEventListener('mouseup', onMouseUp); doc.addEventListener('mouseup', onMouseUp as EventListenerOrEventListenerObject);
} }
+3
View File
@@ -22,3 +22,6 @@ export const clampPosition = (position: XYPosition, extent: NodeExtent) => ({
x: clamp(position.x, extent[0][0], extent[1][0]), x: clamp(position.x, extent[0][0], extent[1][0]),
y: clamp(position.y, extent[0][1], extent[1][1]), y: clamp(position.y, extent[0][1], extent[1][1]),
}); });
export const getHostForElement = (element: HTMLElement): Document | ShadowRoot =>
(element.getRootNode?.() as Document | ShadowRoot) || window?.document;