Skip to content

Commit d2bf5ea

Browse files
iamAbhi-916Abhijeet Jha
and
Abhijeet Jha
authored
Fix: Text component pressRetentionOffset issue on Windows (#14596)
* Fix: Text component pressRetentionOffset issue on Windows * Change files * lint formatting fixed --------- Co-authored-by: Abhijeet Jha <[email protected]>
1 parent 0ab2ba1 commit d2bf5ea

File tree

3 files changed

+31
-9
lines changed

3 files changed

+31
-9
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "none",
3+
"comment": "Fix: Text component pressRetentionOffset issue on Windows",
4+
"packageName": "react-native-windows",
5+
"email": "[email protected]",
6+
"dependentChangeType": "none"
7+
}

vnext/Microsoft.ReactNative/Fabric/Composition/CompositionEventHandler.cpp

+16-9
Original file line numberDiff line numberDiff line change
@@ -1059,21 +1059,33 @@ void CompositionEventHandler::onPointerMoved(
10591059

10601060
facebook::react::PointerEvent pointerEvent = CreatePointerEventFromIncompleteHoverData(ptScaled, ptLocal);
10611061

1062-
auto handler = [&targetView,
1063-
&pointerEvent](std::vector<winrt::Microsoft::ReactNative::ComponentView> &eventPathViews) {
1062+
// check if this pointer corresponds to active touch that has a responder
1063+
auto activeTouch = m_activeTouches.find(pointerId);
1064+
bool isActiveTouch = activeTouch != m_activeTouches.end() && activeTouch->second.eventEmitter != nullptr;
1065+
1066+
auto handler = [&targetView, &pointerEvent, isActiveTouch](
1067+
std::vector<winrt::Microsoft::ReactNative::ComponentView> &eventPathViews) {
10641068
const auto eventEmitter = targetView
10651069
? winrt::get_self<winrt::Microsoft::ReactNative::implementation::ComponentView>(targetView)
10661070
->eventEmitterAtPoint(pointerEvent.offsetPoint)
10671071
: nullptr;
1068-
bool hasMoveEventListeners =
1072+
bool hasMoveEventListeners = isActiveTouch ||
10691073
IsAnyViewInPathListeningToEvent(eventPathViews, facebook::react::ViewEvents::Offset::PointerMove) ||
10701074
IsAnyViewInPathListeningToEvent(eventPathViews, facebook::react::ViewEvents::Offset::PointerMoveCapture);
1075+
10711076
if (eventEmitter != nullptr && hasMoveEventListeners) {
1077+
// Add logging before dispatching the event
10721078
eventEmitter->onPointerMove(pointerEvent);
10731079
}
10741080
};
10751081

10761082
HandleIncomingPointerEvent(pointerEvent, targetView, pointerPoint, keyModifiers, handler);
1083+
1084+
if (isActiveTouch) {
1085+
// For active touches with responders, also dispatch through touch event system
1086+
UpdateActiveTouch(activeTouch->second, ptScaled, ptLocal);
1087+
DispatchTouchEvent(TouchEventType::Move, pointerId, pointerPoint, keyModifiers);
1088+
}
10771089
}
10781090
}
10791091

@@ -1387,12 +1399,7 @@ void CompositionEventHandler::DispatchTouchEvent(
13871399
activeTouch.eventEmitter->onPointerDown(pointerEvent);
13881400
break;
13891401
case TouchEventType::Move: {
1390-
bool hasMoveEventListeners =
1391-
IsAnyViewInPathListeningToEvent(eventPathViews, facebook::react::ViewEvents::Offset::PointerMove) ||
1392-
IsAnyViewInPathListeningToEvent(eventPathViews, facebook::react::ViewEvents::Offset::PointerMoveCapture);
1393-
if (hasMoveEventListeners) {
1394-
activeTouch.eventEmitter->onPointerMove(pointerEvent);
1395-
}
1402+
activeTouch.eventEmitter->onPointerMove(pointerEvent);
13961403
break;
13971404
}
13981405
case TouchEventType::End:

vnext/src-win/Libraries/Text/Text.d.ts

+8
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,14 @@ export interface TextProps
224224
* Controls how touch events are handled. Similar to `View`'s `pointerEvents`.
225225
*/
226226
pointerEvents?: ViewStyle['pointerEvents'] | undefined;
227+
228+
/**
229+
* Insets for press retention.
230+
* Example: { top: 20, left: 20, bottom: 20, right: 20 }
231+
*/
232+
pressRetentionOffset?:
233+
| {top: number; left: number; bottom: number; right: number}
234+
| undefined;
227235
}
228236

229237
/**

0 commit comments

Comments
 (0)