Skip to content

Commit d00f1ef

Browse files
committed
Merge branch '@akwasniewski/logic-detector' into @akwasniewski/v3-examples
2 parents 1dd1d3d + 765e326 commit d00f1ef

File tree

19 files changed

+579
-288
lines changed

19 files changed

+579
-288
lines changed

apps/basic-example/metro.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const { getDefaultConfig } = require('@react-native/metro-config');
22
const { mergeConfig } = require('metro-config');
33

44
const path = require('path');
5-
const exclusionList = require('metro-config/private/defaults/exclusionList');
5+
const exclusionList = require('metro-config/private/defaults/exclusionList').default;
66
const escape = require('escape-string-regexp');
77

88
// Gesture handler tries to require 'react-native-reanimated' inside a try...catch

apps/expo-example/metro.config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const { getDefaultConfig } = require('expo/metro-config');
22
const path = require('path');
33

4-
const exclusionList = require('metro-config/private/defaults/exclusionList');
4+
const exclusionList = require('metro-config/private/defaults/exclusionList').default;
55
const escape = require('escape-string-regexp');
66
const pack = require('./package.json');
77

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -262,13 +262,13 @@ class RNGestureHandlerButtonViewManager :
262262
}
263263
}
264264

265-
override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
266-
if (super.onInterceptTouchEvent(ev)) {
265+
override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
266+
if (super.onInterceptTouchEvent(event)) {
267267
return true
268268
}
269269
// We call `onTouchEvent` and wait until button changes state to `pressed`, if it's pressed
270270
// we return true so that the gesture handler can activate.
271-
onTouchEvent(ev)
271+
onTouchEvent(event)
272272
return isPressed
273273
}
274274

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootHelper.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,12 +115,12 @@ class RNGestureHandlerRootHelper(private val context: ReactContext, wrappedView:
115115
}
116116
}
117117

118-
fun dispatchTouchEvent(ev: MotionEvent): Boolean {
118+
fun dispatchTouchEvent(event: MotionEvent): Boolean {
119119
// We mark `mPassingTouch` before we get into `mOrchestrator.onTouchEvent` so that we can tell
120120
// if `requestDisallow` has been called as a result of a normal gesture handling process or
121121
// as a result of one of the gesture handlers activating
122122
passingTouch = true
123-
orchestrator!!.onTouchEvent(ev)
123+
orchestrator!!.onTouchEvent(event)
124124
passingTouch = false
125125
return shouldIntercept
126126
}

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerRootView.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ class RNGestureHandlerRootView(context: Context?) : ReactViewGroup(context) {
3737
rootHelper?.tearDown()
3838
}
3939

40-
override fun dispatchTouchEvent(ev: MotionEvent) = if (rootViewEnabled && rootHelper!!.dispatchTouchEvent(ev)) {
40+
override fun dispatchTouchEvent(event: MotionEvent) = if (rootViewEnabled && rootHelper!!.dispatchTouchEvent(event)) {
4141
true
4242
} else {
43-
super.dispatchTouchEvent(ev)
43+
super.dispatchTouchEvent(event)
4444
}
4545

4646
override fun dispatchGenericMotionEvent(event: MotionEvent) =

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/events/RNGestureHandlerEvent.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class RNGestureHandlerEvent private constructor() : Event<RNGestureHandlerEvent>
6060
}
6161

6262
// Unfortunately getCoalescingKey is not considered when sending event to C++, therefore we have to disable coalescing in v3
63-
override fun canCoalesce() = actionType != GestureHandler.ACTION_TYPE_NATIVE_DETECTOR
63+
override fun canCoalesce() = !GestureHandler.usesNativeOrLogicDetector(actionType)
6464

6565
override fun getCoalescingKey() = coalescingKey
6666

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/events/RNGestureHandlerTouchEvent.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class RNGestureHandlerTouchEvent private constructor() : Event<RNGestureHandlerT
3939
EVENT_NAME
4040
}
4141

42-
override fun canCoalesce() = true
42+
override fun canCoalesce() = !GestureHandler.usesNativeOrLogicDetector(actionType)
4343

4444
override fun getCoalescingKey() = coalescingKey
4545
override fun getEventData(): WritableMap? = extraData

packages/react-native-gesture-handler/apple/RNGestureHandlerManager.mm

Lines changed: 43 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -312,36 +312,17 @@ - (void)sendEvent:(RNGestureHandlerStateChange *)event
312312
case RNGestureHandlerActionTypeLogicDetector: {
313313
NSNumber *hostDetectorTag = [_registry handlerWithTag:event.handlerTag].hostDetectorTag;
314314
detectorView = [self viewForReactTag:hostDetectorTag];
315-
// intentionally fall through to RNGestureHandlerActionTypeNativeDetector
315+
[self sendNativeOrLogicEvent:event
316+
withActionType:actionType
317+
forHandlerType:eventHandlerType
318+
forView:detectorView];
319+
break;
316320
}
317321
case RNGestureHandlerActionTypeNativeDetector: {
318-
if ([event isKindOfClass:[RNGestureHandlerEvent class]]) {
319-
switch (eventHandlerType) {
320-
case RNGestureHandlerEventHandlerTypeAnimated:
321-
[self sendEventForNativeAnimatedEvent:event];
322-
break;
323-
case RNGestureHandlerEventHandlerTypeReanimated: {
324-
RNGestureHandlerEvent *gestureEvent = (RNGestureHandlerEvent *)event;
325-
auto nativeEvent = [gestureEvent getReanimatedNativeEvent];
326-
[(RNGestureHandlerDetector *)detectorView dispatchReanimatedGestureEvent:nativeEvent];
327-
break;
328-
}
329-
case RNGestureHandlerEventHandlerTypeJS: {
330-
RNGestureHandlerEvent *gestureEvent = (RNGestureHandlerEvent *)event;
331-
auto nativeEvent = [gestureEvent getNativeEvent];
332-
[(RNGestureHandlerDetector *)detectorView dispatchGestureEvent:nativeEvent];
333-
break;
334-
}
335-
}
336-
} else {
337-
if (eventHandlerType == RNGestureHandlerEventHandlerTypeReanimated) {
338-
auto nativeEvent = [event getReanimatedNativeEvent];
339-
[(RNGestureHandlerDetector *)detectorView dispatchReanimatedStateChangeEvent:nativeEvent];
340-
} else {
341-
auto nativeEvent = [event getNativeEvent];
342-
[(RNGestureHandlerDetector *)detectorView dispatchStateChangeEvent:nativeEvent];
343-
}
344-
}
322+
[self sendNativeOrLogicEvent:event
323+
withActionType:actionType
324+
forHandlerType:eventHandlerType
325+
forView:detectorView];
345326
break;
346327
}
347328

@@ -488,6 +469,40 @@ - (void)sendEventForDeviceEvent:(RNGestureHandlerStateChange *)event
488469
[_eventDispatcher sendDeviceEventWithName:@"onGestureHandlerStateChange" body:body];
489470
}
490471

472+
- (void)sendNativeOrLogicEvent:(RNGestureHandlerStateChange *)event
473+
withActionType:(RNGestureHandlerActionType)actionType
474+
forHandlerType:(RNGestureHandlerEventHandlerType)eventHandlerType
475+
forView:(RNGHUIView *)detectorView
476+
{
477+
if ([event isKindOfClass:[RNGestureHandlerEvent class]]) {
478+
switch (eventHandlerType) {
479+
case RNGestureHandlerEventHandlerTypeAnimated:
480+
[self sendEventForNativeAnimatedEvent:event];
481+
break;
482+
case RNGestureHandlerEventHandlerTypeReanimated: {
483+
RNGestureHandlerEvent *gestureEvent = (RNGestureHandlerEvent *)event;
484+
auto nativeEvent = [gestureEvent getReanimatedNativeEvent];
485+
[(RNGestureHandlerDetector *)detectorView dispatchReanimatedGestureEvent:nativeEvent];
486+
break;
487+
}
488+
case RNGestureHandlerEventHandlerTypeJS: {
489+
RNGestureHandlerEvent *gestureEvent = (RNGestureHandlerEvent *)event;
490+
auto nativeEvent = [gestureEvent getNativeEvent];
491+
[(RNGestureHandlerDetector *)detectorView dispatchGestureEvent:nativeEvent];
492+
break;
493+
}
494+
}
495+
} else {
496+
if (eventHandlerType == RNGestureHandlerEventHandlerTypeReanimated) {
497+
auto nativeEvent = [event getReanimatedNativeEvent];
498+
[(RNGestureHandlerDetector *)detectorView dispatchReanimatedStateChangeEvent:nativeEvent];
499+
} else {
500+
auto nativeEvent = [event getNativeEvent];
501+
[(RNGestureHandlerDetector *)detectorView dispatchStateChangeEvent:nativeEvent];
502+
}
503+
}
504+
}
505+
491506
- (RNGHUIView *)viewForReactTag:(NSNumber *)reactTag
492507
{
493508
return [_viewRegistry viewForReactTag:reactTag];

packages/react-native-gesture-handler/src/components/Pressable/Pressable.tsx

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -270,9 +270,13 @@ const Pressable = (props: PressableProps) => {
270270
stateMachine.reset();
271271
handlePressOut(pressableEvent, false);
272272
})
273-
.onFinalize(() => {
273+
.onFinalize((_event, success) => {
274274
if (Platform.OS === 'web') {
275-
stateMachine.handleEvent(StateMachineEvent.FINALIZE);
275+
if (success) {
276+
stateMachine.handleEvent(StateMachineEvent.FINALIZE);
277+
} else {
278+
stateMachine.handleEvent(StateMachineEvent.CANCEL);
279+
}
276280
handleFinalize();
277281
}
278282
}),
@@ -301,11 +305,15 @@ const Pressable = (props: PressableProps) => {
301305
stateMachine.handleEvent(StateMachineEvent.NATIVE_START);
302306
}
303307
})
304-
.onFinalize(() => {
308+
.onFinalize((_event, success) => {
305309
if (Platform.OS !== 'web') {
306310
// On Web we use LongPress().onFinalize() instead of Native().onFinalize(),
307311
// as Native cancels on mouse move, and LongPress does not.
308-
stateMachine.handleEvent(StateMachineEvent.FINALIZE);
312+
if (success) {
313+
stateMachine.handleEvent(StateMachineEvent.FINALIZE);
314+
} else {
315+
stateMachine.handleEvent(StateMachineEvent.CANCEL);
316+
}
309317
handleFinalize();
310318
}
311319
}),

packages/react-native-gesture-handler/src/components/Pressable/stateDefinitions.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export enum StateMachineEvent {
77
NATIVE_START = 'nativeStart',
88
FINALIZE = 'finalize',
99
LONG_PRESS_TOUCHES_DOWN = 'longPressTouchesDown',
10+
CANCEL = 'cancel',
1011
}
1112

1213
function getAndroidStatesConfig(

0 commit comments

Comments
 (0)