Skip to content

Commit fe8b8fe

Browse files
orionmizclaude
andauthored
fix: prevent swipe back gesture during push/pop transitions (#640)
Co-authored-by: Claude <noreply@anthropic.com>
1 parent 1e5aae3 commit fe8b8fe

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@stackflow/react-ui-core": patch
3+
---
4+
5+
Fix swipe back gesture during push/pop transitions by using capture phase event listeners to prevent touch events from reaching child elements during transitions

extensions/react-ui-core/src/usePreventTouchDuringTransition.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,23 @@ export function usePreventTouchDuringTransition({
1818
return;
1919
}
2020

21-
const onTouchStart = (e: TouchEvent) => {
21+
const preventTouch = (e: TouchEvent) => {
2222
e.preventDefault();
23+
e.stopPropagation();
2324
};
2425

25-
const onTouchEnd = (e: TouchEvent) => {
26-
e.preventDefault();
27-
};
28-
29-
$ref.addEventListener("touchstart", onTouchStart);
30-
$ref.addEventListener("touchend", onTouchEnd);
26+
// Use capture phase to prevent all touch events from reaching child elements
27+
// during transitions (including edge swipe area)
28+
$ref.addEventListener("touchstart", preventTouch, { capture: true });
29+
$ref.addEventListener("touchmove", preventTouch, { capture: true });
30+
$ref.addEventListener("touchend", preventTouch, { capture: true });
31+
$ref.addEventListener("touchcancel", preventTouch, { capture: true });
3132

3233
return () => {
33-
$ref.removeEventListener("touchstart", onTouchStart);
34-
$ref.removeEventListener("touchend", onTouchEnd);
34+
$ref.removeEventListener("touchstart", preventTouch, { capture: true });
35+
$ref.removeEventListener("touchmove", preventTouch, { capture: true });
36+
$ref.removeEventListener("touchend", preventTouch, { capture: true });
37+
$ref.removeEventListener("touchcancel", preventTouch, { capture: true });
3538
};
3639
}, [stack?.globalTransitionState]);
3740
}

0 commit comments

Comments
 (0)