Skip to content

Commit fe1d67d

Browse files
committed
one path
1 parent 593c44f commit fe1d67d

12 files changed

+66
-147
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ class RNGestureHandlerEvent private constructor() : Event<RNGestureHandlerEvent>
3434
useNativeAnimatedName: Boolean,
3535
) {
3636
val view = if (handler.actionType == GestureHandler.ACTION_TYPE_NATIVE_DETECTOR) {
37-
handler.viewForEvents!!
37+
handler.viewForEvents
38+
} else if (handler.actionType == GestureHandler.ACTION_TYPE_LOGIC_DETECTOR) {
39+
handler.parentView!!
3840
} else {
3941
handler.view!!
4042
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ class RNGestureHandlerStateChangeEvent private constructor() : Event<RNGestureHa
2828
dataBuilder: GestureHandlerEventDataBuilder<T>,
2929
) {
3030
val view = if (handler.actionType == GestureHandler.ACTION_TYPE_NATIVE_DETECTOR) {
31-
handler.viewForEvents!!
31+
handler.viewForEvents
32+
} else if (handler.actionType == GestureHandler.ACTION_TYPE_LOGIC_DETECTOR) {
33+
handler.parentView!!
3234
} else {
3335
handler.view!!
3436
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ class RNGestureHandlerTouchEvent private constructor() : Event<RNGestureHandlerT
1414

1515
private fun <T : GestureHandler> init(handler: T, actionType: Int) {
1616
val view = if (handler.actionType == GestureHandler.ACTION_TYPE_NATIVE_DETECTOR) {
17-
handler.viewForEvents!!
17+
handler.viewForEvents
18+
} else if (handler.actionType == GestureHandler.ACTION_TYPE_LOGIC_DETECTOR) {
19+
handler.parentView!!
1820
} else {
1921
handler.view!!
2022
}

packages/react-native-gesture-handler/apple/RNGestureHandlerDetector.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,6 @@ NS_ASSUME_NONNULL_BEGIN
2020

2121
- (void)dispatchTouchEvent:(RNGestureHandlerDetectorEventEmitter::OnGestureHandlerTouchEvent)event;
2222

23-
- (void)dispatchLogicStateChangeEvent:(RNGestureHandlerDetectorEventEmitter::OnGestureHandlerLogicStateChange)event;
24-
25-
- (void)dispatchLogicGestureEvent:(RNGestureHandlerDetectorEventEmitter::OnGestureHandlerLogicEvent)event;
26-
27-
- (void)dispatchLogicTouchEvent:(RNGestureHandlerDetectorEventEmitter::OnGestureHandlerLogicTouchEvent)event;
28-
2923
- (void)tryAttachNativeHandlersToChildView;
3024

3125
- (void)detachNativeGestureHandlers;

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

Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -99,30 +99,6 @@ - (void)dispatchTouchEvent:(RNGestureHandlerDetectorEventEmitter::OnGestureHandl
9999
}
100100
}
101101

102-
- (void)dispatchLogicStateChangeEvent:(RNGestureHandlerDetectorEventEmitter::OnGestureHandlerLogicStateChange)event
103-
{
104-
if (_eventEmitter != nullptr) {
105-
std::dynamic_pointer_cast<const RNGestureHandlerDetectorEventEmitter>(_eventEmitter)
106-
->onGestureHandlerLogicStateChange(event);
107-
}
108-
}
109-
110-
- (void)dispatchLogicGestureEvent:(RNGestureHandlerDetectorEventEmitter::OnGestureHandlerLogicEvent)event
111-
{
112-
if (_eventEmitter != nullptr) {
113-
std::dynamic_pointer_cast<const RNGestureHandlerDetectorEventEmitter>(_eventEmitter)
114-
->onGestureHandlerLogicEvent(event);
115-
}
116-
}
117-
118-
- (void)dispatchLogicTouchEvent:(RNGestureHandlerDetectorEventEmitter::OnGestureHandlerLogicTouchEvent)event
119-
{
120-
if (_eventEmitter != nullptr) {
121-
std::dynamic_pointer_cast<const RNGestureHandlerDetectorEventEmitter>(_eventEmitter)
122-
->onGestureHandlerLogicTouchEvent(event);
123-
}
124-
}
125-
126102
- (BOOL)shouldAttachGestureToSubview:(NSNumber *)handlerTag
127103
{
128104
RNGestureHandlerManager *handlerManager = [RNGestureHandlerModule handlerManagerForModuleId:_moduleId];
@@ -190,7 +166,7 @@ - (void)updatePropsInternal:(const std::vector<int> &)handlerTags
190166
[_nativeHandlers addObject:handlerTag];
191167
} else {
192168
if (isLogic) {
193-
NSLog(@"attach logic child %@", handlerTag);
169+
[[[handlerManager registry] handlerWithTag:handlerTag] setParentTag:@(self.tag)];
194170

195171
[handlerManager attachGestureHandler:handlerTag
196172
toViewWithTag:@(viewTag)
@@ -233,33 +209,28 @@ - (void)updateProps:(const Props::Shared &)propsBase oldProps:(const Props::Shar
233209
RNGestureHandlerManager *handlerManager = [RNGestureHandlerModule handlerManagerForModuleId:_moduleId];
234210
react_native_assert(handlerManager != nullptr && "Tried to access a non-existent handler manager")
235211

236-
std::unordered_map<int, bool>
237-
shouldKeepLogicChild;
212+
NSMutableSet *logicChildrenToDelete = [NSMutableSet set];
238213
for (const std::pair<const int, LogicChild> &child : logicChildren) {
239-
shouldKeepLogicChild[child.first] = false;
214+
[logicChildrenToDelete addObject:@(child.first)];
240215
}
241216

242217
for (const RNGestureHandlerDetectorLogicChildrenStruct &child : newProps.logicChildren) {
243218
if (logicChildren.find(child.viewTag) == logicChildren.end()) {
244-
// Initialize the vector for a new logic child
245219
logicChildren[child.viewTag].handlerTags = {};
246220
logicChildren[child.viewTag].attachedHandlers = [NSMutableSet set];
247-
[[[handlerManager registry] handlerWithTag:@(child.viewTag)] setParentTag:@(self.tag)];
248221
}
249-
shouldKeepLogicChild[child.viewTag] = true;
222+
223+
[logicChildrenToDelete removeObject:@(child.viewTag)];
250224
[self updatePropsInternal:child.handlerTags
251225
oldHandlerTags:logicChildren[child.viewTag].handlerTags
252226
isLogic:true
253227
viewTag:child.viewTag
254228
attachedHandlers:logicChildren[child.viewTag].attachedHandlers];
255229
}
256230

257-
for (const auto &child : shouldKeepLogicChild) {
258-
if (!child.second) {
259-
for (id handlerTag : logicChildren[child.first].attachedHandlers) {
260-
[handlerManager.registry detachHandlerWithTag:handlerTag];
261-
}
262-
logicChildren.erase(child.first);
231+
for (const NSNumber *childTag : logicChildrenToDelete) {
232+
for (id handlerTag : logicChildren[childTag.intValue].attachedHandlers) {
233+
[handlerManager.registry detachHandlerWithTag:handlerTag];
263234
}
264235
}
265236

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -321,13 +321,12 @@ - (void)sendEvent:(RNGestureHandlerStateChange *)event
321321
NSNumber *parentTag = [[_registry handlerWithTag:event.handlerTag] getParentTag];
322322
RNGHUIView *parentView = [self viewForReactTag:parentTag];
323323
if ([event isKindOfClass:[RNGestureHandlerEvent class]]) {
324-
// TODO: handle forAnimated
325324
RNGestureHandlerEvent *gestureEvent = (RNGestureHandlerEvent *)event;
326-
auto nativeEvent = [gestureEvent getNativeLogicEvent:@(detectorView.tag)];
327-
[(RNGestureHandlerDetector *)parentView dispatchLogicGestureEvent:nativeEvent];
325+
auto nativeEvent = [gestureEvent getNativeEvent];
326+
[(RNGestureHandlerDetector *)parentView dispatchGestureEvent:nativeEvent];
328327
} else {
329-
auto nativeEvent = [event getNativeLogicEvent:@(detectorView.tag)];
330-
[(RNGestureHandlerDetector *)parentView dispatchLogicStateChangeEvent:nativeEvent];
328+
auto nativeEvent = [event getNativeEvent];
329+
[(RNGestureHandlerDetector *)parentView dispatchStateChangeEvent:nativeEvent];
331330
}
332331
break;
333332
}

packages/react-native-gesture-handler/apple/RNGestureHandlerNativeEventUtils.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,9 @@
55
@interface RNGestureHandlerEvent (NativeEvent)
66

77
- (facebook::react::RNGestureHandlerDetectorEventEmitter::OnGestureHandlerEvent)getNativeEvent;
8-
- (facebook::react::RNGestureHandlerDetectorEventEmitter::OnGestureHandlerLogicEvent)getNativeLogicEvent:
9-
(NSNumber *)childTag;
108
@end
119

1210
@interface RNGestureHandlerStateChange (NativeEvent)
1311

1412
- (facebook::react::RNGestureHandlerDetectorEventEmitter::OnGestureHandlerStateChange)getNativeEvent;
15-
- (facebook::react::RNGestureHandlerDetectorEventEmitter::OnGestureHandlerLogicStateChange)getNativeLogicEvent:
16-
(NSNumber *)childTag;
1713
@end

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

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -67,25 +67,10 @@ @implementation RNGestureHandlerEvent (NativeEvent)
6767
return nativeEvent;
6868
}
6969

70-
- (facebook::react::RNGestureHandlerDetectorEventEmitter::OnGestureHandlerLogicEvent)getNativeLogicEvent:
71-
(NSNumber *)childTag
72-
{
73-
folly::dynamic handlerData = rngh_dynamicFromId(self.extraData.data);
74-
75-
facebook::react::RNGestureHandlerDetectorEventEmitter::OnGestureHandlerLogicEvent nativeEvent = {
76-
.handlerTag = [self.handlerTag intValue],
77-
.state = static_cast<int>(self.state),
78-
.handlerData = handlerData,
79-
.childTag = [childTag intValue]};
80-
81-
return nativeEvent;
82-
}
8370
@end
8471

8572
@implementation RNGestureHandlerStateChange (NativeEvent)
8673

87-
// TODO: unify logic getter
88-
8974
- (facebook::react::RNGestureHandlerDetectorEventEmitter::OnGestureHandlerStateChange)getNativeEvent
9075
{
9176
folly::dynamic handlerData = rngh_dynamicFromId(self.extraData.data);
@@ -100,18 +85,4 @@ @implementation RNGestureHandlerStateChange (NativeEvent)
10085
return nativeEvent;
10186
}
10287

103-
- (facebook::react::RNGestureHandlerDetectorEventEmitter::OnGestureHandlerLogicStateChange)getNativeLogicEvent:
104-
(NSNumber *)childTag
105-
{
106-
folly::dynamic handlerData = rngh_dynamicFromId(self.extraData.data);
107-
108-
facebook::react::RNGestureHandlerDetectorEventEmitter::OnGestureHandlerLogicStateChange nativeEvent = {
109-
.handlerTag = [self.handlerTag intValue],
110-
.state = static_cast<int>(self.state),
111-
.oldState = static_cast<int>(self.previousState),
112-
.handlerData = handlerData,
113-
.childTag = [childTag intValue]};
114-
115-
return nativeEvent;
116-
}
11788
@end

packages/react-native-gesture-handler/src/specs/RNGestureHandlerDetectorNativeComponent.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,6 @@ export interface NativeProps extends ViewProps {
5454
onGestureHandlerStateChange?: DirectEventHandler<GestureHandlerStateChangeEvent>;
5555
onGestureHandlerTouchEvent?: DirectEventHandler<GestureHandlerTouchEvent>;
5656

57-
onGestureHandlerLogicEvent?: DirectEventHandler<GestureHandlerEvent>;
58-
onGestureHandlerLogicStateChange?: DirectEventHandler<GestureHandlerStateChangeEvent>;
59-
onGestureHandlerLogicTouchEvent?: DirectEventHandler<GestureHandlerTouchEvent>;
60-
6157
handlerTags: Int32[];
6258
moduleId: Int32;
6359
logicChildren: LogicProps[];

packages/react-native-gesture-handler/src/v3/NativeDetector.tsx

Lines changed: 41 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -72,36 +72,50 @@ export function NativeDetector({ gesture, children }: NativeDetectorProps) {
7272
return (
7373
<DetectorContext.Provider value={{ register, unregister }}>
7474
<NativeDetectorComponent
75-
onGestureHandlerStateChange={
76-
gesture.gestureEvents.onGestureHandlerStateChange
77-
}
78-
onGestureHandlerEvent={gesture.gestureEvents.onGestureHandlerEvent}
75+
onGestureHandlerStateChange={(e) => {
76+
if (!logicMethods.current.has(e.nativeEvent.handlerTag)) {
77+
invokeNullableMethod(
78+
gesture.gestureEvents.onGestureHandlerStateChange,
79+
e
80+
);
81+
} else {
82+
invokeNullableMethod(
83+
logicMethods.current.get(e.nativeEvent.handlerTag)?.current
84+
?.onGestureHandlerStateChange,
85+
e
86+
);
87+
}
88+
}}
89+
onGestureHandlerEvent={(e) => {
90+
if (!logicMethods.current.has(e.nativeEvent.handlerTag)) {
91+
invokeNullableMethod(
92+
gesture.gestureEvents.onGestureHandlerEvent,
93+
e
94+
);
95+
} else {
96+
invokeNullableMethod(
97+
logicMethods.current.get(e.nativeEvent.handlerTag)?.current
98+
?.onGestureHandlerEvent,
99+
e
100+
);
101+
}
102+
}}
79103
onGestureHandlerAnimatedEvent={
80104
gesture.gestureEvents.onGestureHandlerAnimatedEvent
81105
}
82-
onGestureHandlerTouchEvent={
83-
gesture.gestureEvents.onGestureHandlerTouchEvent
84-
}
85-
onGestureHandlerLogicEvent={(e) => {
86-
invokeNullableMethod(
87-
logicMethods.current.get(e.nativeEvent.handlerTag)?.current
88-
?.onGestureHandlerEvent,
89-
e
90-
);
91-
}}
92-
onGestureHandlerLogicStateChange={(e) => {
93-
invokeNullableMethod(
94-
logicMethods.current.get(e.nativeEvent.handlerTag)?.current
95-
?.onGestureHandlerStateChange,
96-
e
97-
);
98-
}}
99-
onGestureHandlerLogicTouchEvent={(e) => {
100-
invokeNullableMethod(
101-
logicMethods.current.get(e.nativeEvent.handlerTag)?.current
102-
?.onGestureHandlerTouchEvent,
103-
e
104-
);
106+
onGestureHandlerTouchEvent={(e) => {
107+
if (!logicMethods.current.has(e.nativeEvent.handlerTag)) {
108+
invokeNullableMethod(
109+
gesture.gestureEvents.onGestureHandlerTouchEvent,
110+
e
111+
);
112+
} else {
113+
invokeNullableMethod(
114+
logicMethods.current.get(e.nativeEvent.handlerTag)?.current
115+
?.onGestureHandlerTouchEvent,
116+
e
117+
);
118+
}
105119
}}
106120
moduleId={globalThis._RNGH_MODULE_ID}
107121
handlerTags={[gesture.tag]}

0 commit comments

Comments
 (0)