From 7f2b72528eedd144e949e5a8c744ebc5c05ebbac Mon Sep 17 00:00:00 2001 From: Martin Kralik Date: Wed, 3 Feb 2016 05:22:14 -0800 Subject: [PATCH] RCTEvent protocol changes (3/7) Summary: I want to use the `RCTEvent` protocol for touch events as well. That's why I'm removing not very well defined `body` property and replacing it with `arguments` method, which will return an array that will be passed directly to the js call. I think this makes sense because there is no unified arguments format for all events and and the called js method (`moduleDotMethod`) is already event specific. This way touch events and scroll events can result in calling a completely different js function with a completely different arguments (what they indeed currently do). public ___ //This diff is part of a larger stack. For high level overview what's going on jump to D2884593.// Reviewed By: nicklockwood Differential Revision: D2884590 fb-gh-sync-id: 2c1885c3414e255d8572c0fbbbfe62a23d94dd06 --- .../RCTEventDispatcherTests.m | 18 +++++++++++------- React/Base/RCTEventDispatcher.h | 4 +++- React/Base/RCTEventDispatcher.m | 14 +------------- React/Views/RCTScrollView.m | 5 +++++ 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/Examples/UIExplorer/UIExplorerUnitTests/RCTEventDispatcherTests.m b/Examples/UIExplorer/UIExplorerUnitTests/RCTEventDispatcherTests.m index 4cf5c2cd76..a8ec446bfa 100644 --- a/Examples/UIExplorer/UIExplorerUnitTests/RCTEventDispatcherTests.m +++ b/Examples/UIExplorer/UIExplorerUnitTests/RCTEventDispatcherTests.m @@ -29,7 +29,6 @@ @synthesize viewTag = _viewTag; @synthesize eventName = _eventName; -@synthesize body = _body; - (instancetype)initWithViewTag:(NSNumber *)viewTag eventName:(NSString *)eventName body:(NSDictionary *)body { @@ -52,6 +51,11 @@ return @"RCTDeviceEventEmitter.emit"; } +- (NSArray *)arguments +{ + return @[_eventName, _body]; +} + @end @interface RCTEventDispatcherTests : XCTestCase @@ -89,7 +93,7 @@ - (void)testLegacyEventsAreImmediatelyDispatched { [[_bridge expect] enqueueJSCall:_JSMethod - args:@[_eventName, _body]]; + args:[_testEvent arguments]]; [_eventDispatcher sendDeviceEventWithName:_eventName body:_body]; @@ -100,7 +104,7 @@ { _testEvent.canCoalesce = NO; [[_bridge expect] enqueueJSCall:_JSMethod - args:@[_eventName, _body]]; + args:[_testEvent arguments]]; [_eventDispatcher sendEvent:_testEvent]; @@ -112,7 +116,7 @@ [_eventDispatcher sendEvent:_testEvent]; [[_bridge expect] enqueueJSCall:@"RCTDeviceEventEmitter.emit" - args:@[_eventName, _body]]; + args:[_testEvent arguments]]; [(id)_eventDispatcher didUpdateFrame:nil]; @@ -129,7 +133,7 @@ [_eventDispatcher sendEvent:_testEvent]; [[_bridge expect] enqueueJSCall:@"RCTDeviceEventEmitter.emit" - args:@[_eventName, _body]]; + args:[_testEvent arguments]]; [(id)_eventDispatcher didUpdateFrame:nil]; @@ -147,10 +151,10 @@ [_eventDispatcher sendEvent:_testEvent]; [[_bridge expect] enqueueJSCall:@"RCTDeviceEventEmitter.emit" - args:@[firstEventName, _body]]; + args:[firstEvent arguments]]; [[_bridge expect] enqueueJSCall:@"RCTDeviceEventEmitter.emit" - args:@[_eventName, _body]]; + args:[_testEvent arguments]]; [(id)_eventDispatcher didUpdateFrame:nil]; diff --git a/React/Base/RCTEventDispatcher.h b/React/Base/RCTEventDispatcher.h index a6d0bd0ae7..4e4bc67e87 100644 --- a/React/Base/RCTEventDispatcher.h +++ b/React/Base/RCTEventDispatcher.h @@ -48,12 +48,14 @@ RCT_EXTERN NSString *RCTNormalizeInputEventName(NSString *eventName); @property (nonatomic, strong, readonly) NSNumber *viewTag; @property (nonatomic, copy, readonly) NSString *eventName; -@property (nonatomic, copy, readonly) NSDictionary *body; - (BOOL)canCoalesce; - (id)coalesceWithEvent:(id)newEvent; +// used directly for doing a JS call + (NSString *)moduleDotMethod; +// must contain only JSON compatible values +- (NSArray *)arguments; @end diff --git a/React/Base/RCTEventDispatcher.m b/React/Base/RCTEventDispatcher.m index 5681c3fed9..96f55e4326 100644 --- a/React/Base/RCTEventDispatcher.m +++ b/React/Base/RCTEventDispatcher.m @@ -159,19 +159,7 @@ RCT_EXPORT_MODULE() - (void)dispatchEvent:(id)event { - NSMutableArray *arguments = [NSMutableArray new]; - - if (event.viewTag) { - [arguments addObject:event.viewTag]; - } - - [arguments addObject:RCTNormalizeInputEventName(event.eventName)]; - - if (event.body) { - [arguments addObject:event.body]; - } - - [_bridge enqueueJSCall:[[event class] moduleDotMethod] args:arguments]; + [_bridge enqueueJSCall:[[event class] moduleDotMethod] args:[event arguments]]; } - (dispatch_queue_t)methodQueue diff --git a/React/Views/RCTScrollView.m b/React/Views/RCTScrollView.m index 97ede2145a..09c6061762 100644 --- a/React/Views/RCTScrollView.m +++ b/React/Views/RCTScrollView.m @@ -129,6 +129,11 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init) return @"RCTEventEmitter.receiveEvent"; } +- (NSArray *)arguments +{ + return @[self.viewTag, RCTNormalizeInputEventName(self.eventName), [self body]]; +} + @end /**