From 3c765a82dc05f8c5207b60bafba737398affe412 Mon Sep 17 00:00:00 2001 From: Yehor Kharchenko Date: Wed, 21 Oct 2026 11:39:19 +0200 Subject: [PATCH 1/2] [Web] Start hover on the first pointer move when pointerenter was missed --- .../src/web/handlers/HoverGestureHandler.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/react-native-gesture-handler/src/web/handlers/HoverGestureHandler.ts b/packages/react-native-gesture-handler/src/web/handlers/HoverGestureHandler.ts index 0f13b55b1c..ad7997c026 100644 --- a/packages/react-native-gesture-handler/src/web/handlers/HoverGestureHandler.ts +++ b/packages/react-native-gesture-handler/src/web/handlers/HoverGestureHandler.ts @@ -49,6 +49,12 @@ export default class HoverGestureHandler extends GestureHandler { } protected override onPointerMove(event: AdaptedEvent): void { + // `pointerenter` may fire before listeners are attached + if (this.state === State.UNDETERMINED) { + this.onPointerMoveOver(event); + return; + } + this.tracker.track(event); this.stylusData = event.stylusData; From 9289b8818427751e9d4bc0994b4a96c836ac3f21 Mon Sep 17 00:00:00 2001 From: Yehor Kharchenko Date: Wed, 21 Oct 2026 16:25:56 +0200 Subject: [PATCH 2/2] [Web] Track pointer before retrying hover start on pointer move --- .../src/web/handlers/HoverGestureHandler.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/react-native-gesture-handler/src/web/handlers/HoverGestureHandler.ts b/packages/react-native-gesture-handler/src/web/handlers/HoverGestureHandler.ts index ad7997c026..8f83f439e3 100644 --- a/packages/react-native-gesture-handler/src/web/handlers/HoverGestureHandler.ts +++ b/packages/react-native-gesture-handler/src/web/handlers/HoverGestureHandler.ts @@ -49,15 +49,15 @@ export default class HoverGestureHandler extends GestureHandler { } protected override onPointerMove(event: AdaptedEvent): void { + this.tracker.track(event); + this.stylusData = event.stylusData; + // `pointerenter` may fire before listeners are attached if (this.state === State.UNDETERMINED) { this.onPointerMoveOver(event); return; } - this.tracker.track(event); - this.stylusData = event.stylusData; - super.onPointerMove(event); } }