fix(core): properly cleanup handlers when drag is disabled

This commit is contained in:
braks
2023-11-04 19:25:49 +01:00
committed by Braks
parent 1dfe68306b
commit c30ddc61ed
+32 -18
View File
@@ -121,7 +121,7 @@ export function useDrag(params: UseDragParams) {
} }
} }
const autoPan = (): void => { const autoPan = () => {
if (!containerBounds) { if (!containerBounds) {
return return
} }
@@ -142,14 +142,7 @@ export function useDrag(params: UseDragParams) {
autoPanId = requestAnimationFrame(autoPan) autoPanId = requestAnimationFrame(autoPan)
} }
watch([() => toValue(disabled), el], ([isDisabled, nodeEl]) => { const startDrag = (event: UseDragEvent, nodeEl: Element) => {
if (nodeEl) {
const selection = select(nodeEl)
if (isDisabled) {
selection.on('.drag', null)
} else {
const startDrag = (event: UseDragEvent) => {
dragStarted = true dragStarted = true
const node = findNode(id) const node = findNode(id)
@@ -187,18 +180,18 @@ export function useDrag(params: UseDragParams) {
} }
} }
dragHandler = drag() const eventStart = (event: UseDragEvent, nodeEl: Element) => {
.on('start', (event: UseDragEvent) => {
if (nodeDragThreshold.value === 0) { if (nodeDragThreshold.value === 0) {
startDrag(event) startDrag(event, nodeEl)
} }
lastPos = getPointerPosition(event) lastPos = getPointerPosition(event)
containerBounds = vueFlowRef.value?.getBoundingClientRect() || null containerBounds = vueFlowRef.value?.getBoundingClientRect() || null
mousePosition = getEventPosition(event.sourceEvent, containerBounds!) mousePosition = getEventPosition(event.sourceEvent, containerBounds!)
}) }
.on('drag', (event: UseDragEvent) => {
const eventDrag = (event: UseDragEvent, nodeEl: Element) => {
const pointerPos = getPointerPosition(event) const pointerPos = getPointerPosition(event)
if (!autoPanStarted && dragStarted && autoPanOnNodeDrag.value) { if (!autoPanStarted && dragStarted && autoPanOnNodeDrag.value) {
@@ -212,7 +205,7 @@ export function useDrag(params: UseDragParams) {
const distance = Math.sqrt(x * x + y * y) const distance = Math.sqrt(x * x + y * y)
if (distance > nodeDragThreshold.value) { if (distance > nodeDragThreshold.value) {
startDrag(event) startDrag(event, nodeEl)
} }
} }
@@ -223,8 +216,9 @@ export function useDrag(params: UseDragParams) {
updateNodes(pointerPos) updateNodes(pointerPos)
} }
}) }
.on('end', (event: UseDragEvent) => {
const eventEnd = (event: UseDragEvent) => {
if (!dragStarted) { if (!dragStarted) {
return return
} }
@@ -245,7 +239,17 @@ export function useDrag(params: UseDragParams) {
onStop({ event: event.sourceEvent, node: currentNode, nodes }) onStop({ event: event.sourceEvent, node: currentNode, nodes })
} }
}) }
watch([() => toValue(disabled), el], ([isDisabled, nodeEl], _, onCleanup) => {
if (nodeEl) {
const selection = select(nodeEl)
if (!isDisabled) {
dragHandler = drag()
.on('start', (event: UseDragEvent) => eventStart(event, nodeEl))
.on('drag', (event: UseDragEvent) => eventDrag(event, nodeEl))
.on('end', (event: UseDragEvent) => eventEnd(event))
.filter((event: D3DragEvent<HTMLDivElement, null, SubjectPosition>['sourceEvent']) => { .filter((event: D3DragEvent<HTMLDivElement, null, SubjectPosition>['sourceEvent']) => {
const target = event.target as HTMLDivElement const target = event.target as HTMLDivElement
const unrefDragHandle = toValue(dragHandle) const unrefDragHandle = toValue(dragHandle)
@@ -260,6 +264,16 @@ export function useDrag(params: UseDragParams) {
selection.call(dragHandler) selection.call(dragHandler)
} }
onCleanup(() => {
selection.on('.drag', null)
if (dragHandler) {
dragHandler.on('start', null)
dragHandler.on('drag', null)
dragHandler.on('end', null)
}
})
} }
}) })