Skip to content

Commit a5c602c

Browse files
committed
Cleanup drag state when a resize handle unmounts while dragging
1 parent 7988684 commit a5c602c

File tree

3 files changed

+11
-2
lines changed

3 files changed

+11
-2
lines changed

packages/react-resizable-panels/src/PanelGroup.ts

+1
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,7 @@ function PanelGroupWithForwardedRef({
816816
[resizePanel]
817817
);
818818

819+
// TODO Multiple drag handles can be active at the same time so this API is a bit awkward now
819820
const startDragging = useCallback(
820821
(dragHandleId: string, event: ResizeEvent) => {
821822
const { direction } = committedValuesRef.current;

packages/react-resizable-panels/src/PanelResizeHandle.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,15 @@ export function PanelResizeHandle({
129129
const setResizeHandlerState = (
130130
action: ResizeHandlerAction,
131131
isActive: boolean,
132-
event: ResizeEvent
132+
event: ResizeEvent | null
133133
) => {
134134
if (isActive) {
135135
switch (action) {
136136
case "down": {
137137
setState("drag");
138138

139+
assert(event, 'Expected event to be defined for "down" action');
140+
139141
startDragging(resizeHandleId, event);
140142

141143
const { onDragging } = callbacksRef.current;
@@ -151,6 +153,8 @@ export function PanelResizeHandle({
151153
setState("hover");
152154
}
153155

156+
assert(event, 'Expected event to be defined for "move" action');
157+
154158
resizeHandler(event);
155159
break;
156160
}

packages/react-resizable-panels/src/PanelResizeHandleRegistry.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export type ResizeHandlerAction = "down" | "move" | "up";
99
export type SetResizeHandlerState = (
1010
action: ResizeHandlerAction,
1111
isActive: boolean,
12-
event: ResizeEvent
12+
event: ResizeEvent | null
1313
) => void;
1414

1515
export type PointerHitAreaMargins = {
@@ -83,6 +83,10 @@ export function registerResizeHandle(
8383
}
8484

8585
updateCursor();
86+
87+
// Also instruct the handle to stop dragging; this prevents the parent group from being left in an inconsistent state
88+
// See github.com/bvaughn/react-resizable-panels/issues/402
89+
setResizeHandlerState("up", true, null);
8690
}
8791
};
8892
}

0 commit comments

Comments
 (0)