Skip to content

Commit 592cb47

Browse files
committed
Simplified add/remove listener logic
1 parent bc35776 commit 592cb47

File tree

5 files changed

+21
-29
lines changed

5 files changed

+21
-29
lines changed
Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,19 @@
1+
import { read } from "../mutableState";
12
import { onWindowPointerMove } from "./onWindowPointerMove";
23

34
export function onGroupPointerLeave(event: PointerEvent) {
4-
// The "pointerleave" event is not reliably triggered when the pointer exits a window or iframe
5-
// To account for this, we listen for "pointerleave" events on the Group element itself
6-
// The easiest way to handle these is to reuse the same logic as the Window "pointermove" event
7-
onWindowPointerMove(event);
5+
const { interactionState } = read();
6+
7+
switch (interactionState.state) {
8+
case "active": {
9+
interactionState.hitRegions.forEach((hitRegion) => {
10+
if (event.currentTarget === hitRegion.group.element) {
11+
// The "pointerleave" event is not reliably triggered when the pointer exits a window or iframe
12+
// To account for this, we listen for "pointerleave" events on the Group element itself
13+
// The easiest way to handle these is to reuse the same logic as the Window "pointermove" event
14+
onWindowPointerMove(event);
15+
}
16+
});
17+
}
18+
}
819
}

lib/global/event-handlers/onWindowPointerDown.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import type { RegisteredPanel } from "../../components/panel/types";
33
import type { RegisteredSeparator } from "../../components/separator/types";
44
import { read, update } from "../mutableState";
55
import { findMatchingHitRegions } from "../utils/findMatchingHitRegions";
6-
import { onGroupPointerLeave } from "./onGroupPointerLeave";
76

87
export function onWindowPointerDown(event: PointerEvent) {
98
if (event.defaultPrevented) {
@@ -28,10 +27,6 @@ export function onWindowPointerDown(event: PointerEvent) {
2827
separators.add(current.separator);
2928
}
3029

31-
// The "pointerleave" event is not reliably triggered when the pointer exits a window or iframe
32-
// To account for this, we listen for "pointerleave" events on the Group element itself
33-
current.group.element.addEventListener("pointerleave", onGroupPointerLeave);
34-
3530
const match = mountedGroups.get(current.group);
3631
if (match) {
3732
initialLayoutMap.set(current.group, match.layout);

lib/global/event-handlers/onWindowPointerMove.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { read, update } from "../mutableState";
99
import { adjustLayoutByDelta } from "../utils/adjustLayoutByDelta";
1010
import { findMatchingHitRegions } from "../utils/findMatchingHitRegions";
1111
import { layoutsEqual } from "../utils/layoutsEqual";
12-
import { onGroupPointerLeave } from "./onGroupPointerLeave";
1312

1413
export function onWindowPointerMove(event: PointerEvent) {
1514
if (event.defaultPrevented) {
@@ -27,13 +26,6 @@ export function onWindowPointerMove(event: PointerEvent) {
2726
event.type !== "pointerleave" &&
2827
event.buttons === 0
2928
) {
30-
interactionState.hitRegions.forEach((hitRegion) => {
31-
hitRegion.group.element.removeEventListener(
32-
"pointerleave",
33-
onGroupPointerLeave
34-
);
35-
});
36-
3729
update((prevState) =>
3830
prevState.interactionState.state === "inactive"
3931
? prevState

lib/global/event-handlers/onWindowPointerUp.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { updateCursorStyle } from "../cursor/updateCursorStyle";
22
import { read, update } from "../mutableState";
3-
import { onGroupPointerLeave } from "./onGroupPointerLeave";
43

54
export function onWindowPointerUp(event: PointerEvent) {
65
if (event.defaultPrevented) {
@@ -13,13 +12,6 @@ export function onWindowPointerUp(event: PointerEvent) {
1312

1413
switch (interactionState.state) {
1514
case "active": {
16-
interactionState.hitRegions.forEach((hitRegion) => {
17-
hitRegion.group.element.removeEventListener(
18-
"pointerleave",
19-
onGroupPointerLeave
20-
);
21-
});
22-
2315
update({
2416
cursorFlags: 0,
2517
interactionState: {

lib/global/mountGroup.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,10 @@ export function mountGroup(group: RegisteredGroup) {
102102
})
103103
}));
104104

105+
// The "pointerleave" event is not reliably triggered when the pointer exits a window or iframe
106+
// To account for this, we listen for "pointerleave" events on the Group element itself
107+
group.element.addEventListener("pointerleave", onGroupPointerLeave);
108+
105109
group.separators.forEach((separator) => {
106110
assert(
107111
!separatorIds.has(separator.id),
@@ -130,14 +134,12 @@ export function mountGroup(group: RegisteredGroup) {
130134
return { mountedGroups };
131135
});
132136

137+
group.element.removeEventListener("pointerleave", onGroupPointerLeave);
138+
133139
group.separators.forEach((separator) => {
134140
separator.element.removeEventListener("keydown", onWindowKeyDown);
135141
});
136142

137-
// Edge case:
138-
// In case this group is removed while a drag is in progress, clean up any temporary event listeners
139-
group.element.removeEventListener("pointerleave", onGroupPointerLeave);
140-
141143
// If this was the last group to be mounted, tear down event handlers
142144
if (nextState.mountedGroups.size === 0) {
143145
window.removeEventListener("pointerdown", onWindowPointerDown);

0 commit comments

Comments
 (0)