diff --git a/React/Modules/RCTEventEmitter.h b/React/Modules/RCTEventEmitter.h index bee9513da94..700368c599d 100644 --- a/React/Modules/RCTEventEmitter.h +++ b/React/Modules/RCTEventEmitter.h @@ -6,12 +6,13 @@ */ #import +#import /** * RCTEventEmitter is an abstract base class to be used for modules that emit * events to be observed by JS. */ -@interface RCTEventEmitter : NSObject +@interface RCTEventEmitter : NSObject @property (nonatomic, weak) RCTBridge *bridge; diff --git a/React/Modules/RCTEventEmitter.m b/React/Modules/RCTEventEmitter.m index 6444afd4ec9..1f28fd1b77c 100644 --- a/React/Modules/RCTEventEmitter.m +++ b/React/Modules/RCTEventEmitter.m @@ -15,6 +15,8 @@ NSInteger _listenerCount; } +@synthesize invokeJS = _invokeJS; + + (NSString *)moduleName { return @""; @@ -35,7 +37,7 @@ - (void)sendEventWithName:(NSString *)eventName body:(id)body { - RCTAssert(_bridge != nil, @"Error when sending event: %@ with body: %@. " + RCTAssert(_bridge != nil || _invokeJS != nil, @"Error when sending event: %@ with body: %@. " "Bridge is not set. This is probably because you've " "explicitly synthesized the bridge in %@, even though it's inherited " "from RCTEventEmitter.", eventName, body, [self class]); @@ -44,11 +46,13 @@ RCTLogError(@"`%@` is not a supported event type for %@. Supported events are: `%@`", eventName, [self class], [[self supportedEvents] componentsJoinedByString:@"`, `"]); } - if (_listenerCount > 0) { + if (_listenerCount > 0 && _bridge) { [_bridge enqueueJSCall:@"RCTDeviceEventEmitter" method:@"emit" args:body ? @[eventName, body] : @[eventName] completion:NULL]; + } else if (_listenerCount > 0 && _invokeJS) { + _invokeJS(@"RCTDeviceEventEmitter", @"emit", body ? @[eventName, body] : @[eventName]); } else { RCTLogWarn(@"Sending `%@` with no listeners registered.", eventName); }