diff --git a/lib/ios/RNNBridgeEventEmitter.mm b/lib/ios/RNNBridgeEventEmitter.mm index 36ee10d53c7..bf153caecb3 100644 --- a/lib/ios/RNNBridgeEventEmitter.mm +++ b/lib/ios/RNNBridgeEventEmitter.mm @@ -2,6 +2,4 @@ @implementation RNNBridgeEventEmitter {} -RCT_EXPORT_MODULE() - @end diff --git a/lib/ios/RNNEventEmitter.h b/lib/ios/RNNEventEmitter.h index b3184ce45a7..2008014e6a0 100644 --- a/lib/ios/RNNEventEmitter.h +++ b/lib/ios/RNNEventEmitter.h @@ -1,7 +1,13 @@ #import #import -@interface RNNEventEmitter : RCTEventEmitter +@class RCTHost; +@class RCTBridge; + +@interface RNNEventEmitter : NSObject + +- (void)setHost:(RCTHost *)host; +@property(nonatomic, strong, readonly) RCTHost *host; - (void)sendOnAppLaunched; diff --git a/lib/ios/RNNEventEmitter.mm b/lib/ios/RNNEventEmitter.mm index 81dc886fc0a..fe03a354ed9 100644 --- a/lib/ios/RNNEventEmitter.mm +++ b/lib/ios/RNNEventEmitter.mm @@ -1,45 +1,21 @@ #import "RNNEventEmitter.h" #import "RNNUtils.h" +#import "RNNTurboEventEmitter.h" +#import -@implementation RNNEventEmitter { - RCTEventEmitter *_emitter; - NSInteger _appLaunchedListenerCount; - BOOL _appLaunchedEventDeferred; -} - -static NSString *const AppLaunched = @"RNN.AppLaunched"; -static NSString *const CommandCompleted = @"RNN.CommandCompleted"; -static NSString *const BottomTabSelected = @"RNN.BottomTabSelected"; -static NSString *const BottomTabLongPressed = @"RNN.BottomTabLongPressed"; -static NSString *const ComponentWillAppear = @"RNN.ComponentWillAppear"; -static NSString *const ComponentDidAppear = @"RNN.ComponentDidAppear"; -static NSString *const ComponentDidDisappear = @"RNN.ComponentDidDisappear"; -static NSString *const NavigationButtonPressed = @"RNN.NavigationButtonPressed"; -static NSString *const ModalDismissed = @"RNN.ModalDismissed"; -static NSString *const ModalAttemptedToDismiss = @"RNN.ModalAttemptedToDismiss"; -static NSString *const SearchBarUpdated = @"RNN.SearchBarUpdated"; -static NSString *const SearchBarCancelPressed = @"RNN.SearchBarCancelPressed"; -static NSString *const PreviewCompleted = @"RNN.PreviewCompleted"; -static NSString *const ScreenPopped = @"RNN.ScreenPopped"; -static NSString *const BottomTabPressed = @"RNN.BottomTabPressed"; - -- (NSArray *)supportedEvents { - return @[ - AppLaunched, CommandCompleted, BottomTabSelected, BottomTabLongPressed, BottomTabPressed, - ComponentWillAppear, ComponentDidAppear, ComponentDidDisappear, NavigationButtonPressed, - ModalDismissed, SearchBarUpdated, SearchBarCancelPressed, PreviewCompleted, ScreenPopped, - ModalAttemptedToDismiss - ]; +@implementation RNNEventEmitter { } + +- (void)setHost:(RCTHost *)host { + if (_host != nil) { + return; + } + _host = host; } #pragma mark public - (void)sendOnAppLaunched { - if (_appLaunchedListenerCount > 0) { - [self send:AppLaunched body:nil]; - } else { - _appLaunchedEventDeferred = TRUE; - } + [self send:AppLaunched body:nil]; } - (void)sendComponentWillAppear:(NSString *)componentId @@ -140,24 +116,19 @@ - (void)sendScreenPoppedEvent:(NSString *)componentId { [self send:ScreenPopped body:@{@"componentId" : componentId}]; } -- (void)addListener:(NSString *)eventName { - [super addListener:eventName]; - if ([eventName isEqualToString:AppLaunched]) { - _appLaunchedListenerCount++; - if (_appLaunchedEventDeferred) { - _appLaunchedEventDeferred = FALSE; - [self sendOnAppLaunched]; - } - } -} - #pragma mark private - (void)send:(NSString *)eventName body:(id)body { - if (self.bridge == nil) { - return; - } - [self sendEventWithName:eventName body:body]; + if (_host == nil) { + return; + } + + RNNTurboEventEmitter *_eventEmitter = [[_host moduleRegistry] moduleForName:"RNNTurboEventEmitter"]; + if (_eventEmitter == nil) { + return; + } + + [_eventEmitter send:eventName body:body]; } @end diff --git a/lib/ios/RNNReactButtonView.mm b/lib/ios/RNNReactButtonView.mm index 52dccc00d5f..607d91286bf 100644 --- a/lib/ios/RNNReactButtonView.mm +++ b/lib/ios/RNNReactButtonView.mm @@ -5,7 +5,7 @@ @implementation RNNReactButtonView - (instancetype)initWithHost:(RCTHost *)host moduleName:(NSString *)moduleName initialProperties:(NSDictionary *)initialProperties - eventEmitter:(RNNTurboEventEmitter *)eventEmitter + eventEmitter:(RNNEventEmitter *)eventEmitter sizeMeasureMode:(RCTSurfaceSizeMeasureMode)sizeMeasureMode reactViewReadyBlock:(RNNReactViewReadyCompletionBlock)reactViewReadyBlock { self = [super initWithHost:host moduleName:moduleName initialProperties:initialProperties eventEmitter:eventEmitter sizeMeasureMode:convertToSurfaceSizeMeasureMode(RCTRootViewSizeFlexibilityWidthAndHeight) reactViewReadyBlock:reactViewReadyBlock]; diff --git a/lib/ios/RNNReactView.h b/lib/ios/RNNReactView.h index fce3079fcd4..3a3540b7778 100644 --- a/lib/ios/RNNReactView.h +++ b/lib/ios/RNNReactView.h @@ -15,7 +15,7 @@ #define ComponentTypeButton @"TopBarButton" #define ComponentTypeBackground @"TopBarBackground" -#import "RNNTurboEventEmitter.h" +#import "RNNEventEmitter.h" #ifdef RCT_NEW_ARCH_ENABLED static RCTSurfaceSizeMeasureMode convertToSurfaceSizeMeasureMode(RCTRootViewSizeFlexibility sizeFlexibility) @@ -94,7 +94,7 @@ typedef void (^RNNReactViewReadyCompletionBlock)(void); - (instancetype)initWithHost:(RCTHost *)host moduleName:(NSString *)moduleName initialProperties:(NSDictionary *)initialProperties - eventEmitter:(RNNTurboEventEmitter *)eventEmitter + eventEmitter:(RNNEventEmitter *)eventEmitter sizeMeasureMode:(RCTSurfaceSizeMeasureMode)sizeMeasureMode reactViewReadyBlock:(RNNReactViewReadyCompletionBlock)reactViewReadyBlock; diff --git a/lib/ios/RNNReactView.mm b/lib/ios/RNNReactView.mm index c84de2b5322..1d2878778f0 100644 --- a/lib/ios/RNNReactView.mm +++ b/lib/ios/RNNReactView.mm @@ -57,7 +57,7 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge - (instancetype)initWithHost:(RCTHost *)host moduleName:(NSString *)moduleName initialProperties:(NSDictionary *)initialProperties - eventEmitter:(RNNTurboEventEmitter *)eventEmitter + eventEmitter:(RNNEventEmitter *)eventEmitter sizeMeasureMode:(RCTSurfaceSizeMeasureMode)sizeMeasureMode reactViewReadyBlock:(RNNReactViewReadyCompletionBlock)reactViewReadyBlock { diff --git a/lib/ios/StackControllerDelegate.h b/lib/ios/StackControllerDelegate.h index 3014ee0a743..dff5a31ba32 100644 --- a/lib/ios/StackControllerDelegate.h +++ b/lib/ios/StackControllerDelegate.h @@ -1,5 +1,5 @@ #ifdef RCT_NEW_ARCH_ENABLED -#import "RNNTurboEventEmitter.h" +#import "RNNEventEmitter.h" #else #import "RNNEventEmitter.h" #endif @@ -11,7 +11,7 @@ @interface StackControllerDelegate : NSObject #ifdef RCT_NEW_ARCH_ENABLED -- (instancetype)initWithEventEmitter:(RNNTurboEventEmitter *)eventEmitter; +- (instancetype)initWithEventEmitter:(RNNEventEmitter *)eventEmitter; #else - (instancetype)initWithEventEmitter:(RNNEventEmitter *)eventEmitter; #endif diff --git a/lib/ios/StackControllerDelegate.mm b/lib/ios/StackControllerDelegate.mm index e380e1d7dad..99d77c5166f 100644 --- a/lib/ios/StackControllerDelegate.mm +++ b/lib/ios/StackControllerDelegate.mm @@ -5,7 +5,7 @@ @implementation StackControllerDelegate { #ifdef RCT_NEW_ARCH_ENABLED - RNNTurboEventEmitter *_eventEmitter; + RNNEventEmitter *_eventEmitter; #else RNNEventEmitter *_eventEmitter; #endif @@ -14,7 +14,7 @@ @implementation StackControllerDelegate { } #ifdef RCT_NEW_ARCH_ENABLED -- (instancetype)initWithEventEmitter:(RNNTurboEventEmitter *)eventEmitter { +- (instancetype)initWithEventEmitter:(RNNEventEmitter *)eventEmitter { #else - (instancetype)initWithEventEmitter:(RNNEventEmitter *)eventEmitter { #endif @@ -72,21 +72,12 @@ - (BOOL)navigationController:(UINavigationController *)navigationController toVCOptionsWithDefault.animations.push.hasCustomAnimation) { RNNScreenTransition *screenTransition = toVCOptionsWithDefault.animations.push; #ifdef RCT_NEW_ARCH_ENABLED - if (_eventEmitter.host != nil) { - return [[ScreenAnimationController alloc] - initWithContentTransition:screenTransition.content - elementTransitions:screenTransition.elementTransitions - sharedElementTransitions:screenTransition.sharedElementTransitions - duration:screenTransition.maxDuration - host:_eventEmitter.host]; - } else { - return [[ScreenAnimationController alloc] - initWithContentTransition:screenTransition.content - elementTransitions:screenTransition.elementTransitions - sharedElementTransitions:screenTransition.sharedElementTransitions - duration:screenTransition.maxDuration - bridge:_eventEmitter.bridge]; - } + return [[ScreenAnimationController alloc] + initWithContentTransition:screenTransition.content + elementTransitions:screenTransition.elementTransitions + sharedElementTransitions:screenTransition.sharedElementTransitions + duration:screenTransition.maxDuration + host:_eventEmitter.host]; #else return [[ScreenAnimationController alloc] initWithContentTransition:screenTransition.content @@ -99,21 +90,12 @@ - (BOOL)navigationController:(UINavigationController *)navigationController fromVCOptionsWithDefault.animations.pop.hasCustomAnimation) { RNNScreenTransition *screenTransition = fromVCOptionsWithDefault.animations.pop; #ifdef RCT_NEW_ARCH_ENABLED - if (_eventEmitter.host != nil) { - return [[ScreenReversedAnimationController alloc] - initWithContentTransition:screenTransition.content - elementTransitions:screenTransition.elementTransitions - sharedElementTransitions:screenTransition.sharedElementTransitions - duration:screenTransition.maxDuration - host:_eventEmitter.host]; - } else { - return [[ScreenReversedAnimationController alloc] - initWithContentTransition:screenTransition.content - elementTransitions:screenTransition.elementTransitions - sharedElementTransitions:screenTransition.sharedElementTransitions - duration:screenTransition.maxDuration - bridge:_eventEmitter.bridge]; - } + return [[ScreenReversedAnimationController alloc] + initWithContentTransition:screenTransition.content + elementTransitions:screenTransition.elementTransitions + sharedElementTransitions:screenTransition.sharedElementTransitions + duration:screenTransition.maxDuration + host:_eventEmitter.host]; #else return [[ScreenReversedAnimationController alloc] initWithContentTransition:screenTransition.content diff --git a/lib/ios/TurboModules/RNNTurboEventEmitter.h b/lib/ios/TurboModules/RNNTurboEventEmitter.h index bce05b3a56b..56d1fb7e5cd 100644 --- a/lib/ios/TurboModules/RNNTurboEventEmitter.h +++ b/lib/ios/TurboModules/RNNTurboEventEmitter.h @@ -2,13 +2,25 @@ #import "RNNEventEmitter.h" #import -@class RCTHost; +typedef NSString * EmitterEvents NS_STRING_ENUM; -@interface RNNTurboEventEmitter : RNNEventEmitter - -- (void)setHost:(RCTHost *)host; - -@property(nonatomic, strong, readonly) RCTHost *host; +extern EmitterEvents const AppLaunched; +extern EmitterEvents const CommandCompleted; +extern EmitterEvents const BottomTabSelected; +extern EmitterEvents const BottomTabLongPressed; +extern EmitterEvents const ComponentWillAppear; +extern EmitterEvents const ComponentDidAppear; +extern EmitterEvents const ComponentDidDisappear; +extern EmitterEvents const NavigationButtonPressed; +extern EmitterEvents const ModalDismissed; +extern EmitterEvents const ModalAttemptedToDismiss; +extern EmitterEvents const SearchBarUpdated; +extern EmitterEvents const SearchBarCancelPressed; +extern EmitterEvents const PreviewCompleted; +extern EmitterEvents const ScreenPopped; +extern EmitterEvents const BottomTabPressed; +@interface RNNTurboEventEmitter : RCTEventEmitter +- (void)send:(NSString *)eventName body:(id)body; @end #endif diff --git a/lib/ios/TurboModules/RNNTurboEventEmitter.mm b/lib/ios/TurboModules/RNNTurboEventEmitter.mm index b5941a548ce..0ea7a556129 100644 --- a/lib/ios/TurboModules/RNNTurboEventEmitter.mm +++ b/lib/ios/TurboModules/RNNTurboEventEmitter.mm @@ -1,7 +1,28 @@ #ifdef RCT_NEW_ARCH_ENABLED #import "RNNTurboEventEmitter.h" -@implementation RNNTurboEventEmitter {} +#import "RNNUtils.h" + +EmitterEvents const AppLaunched = @"RNN.AppLaunched"; +EmitterEvents const CommandCompleted = @"RNN.CommandCompleted"; +EmitterEvents const BottomTabSelected = @"RNN.BottomTabSelected"; +EmitterEvents const BottomTabLongPressed = @"RNN.BottomTabLongPressed"; +EmitterEvents const ComponentWillAppear = @"RNN.ComponentWillAppear"; +EmitterEvents const ComponentDidAppear = @"RNN.ComponentDidAppear"; +EmitterEvents const ComponentDidDisappear = @"RNN.ComponentDidDisappear"; +EmitterEvents const NavigationButtonPressed = @"RNN.NavigationButtonPressed"; +EmitterEvents const ModalDismissed = @"RNN.ModalDismissed"; +EmitterEvents const ModalAttemptedToDismiss = @"RNN.ModalAttemptedToDismiss"; +EmitterEvents const SearchBarUpdated = @"RNN.SearchBarUpdated"; +EmitterEvents const SearchBarCancelPressed = @"RNN.SearchBarCancelPressed"; +EmitterEvents const PreviewCompleted = @"RNN.PreviewCompleted"; +EmitterEvents const ScreenPopped = @"RNN.ScreenPopped"; +EmitterEvents const BottomTabPressed = @"RNN.BottomTabPressed"; + +@implementation RNNTurboEventEmitter { + NSInteger _appLaunchedListenerCount; + BOOL _appLaunchedEventDeferred; +} RCT_EXPORT_MODULE() @@ -11,18 +32,35 @@ @implementation RNNTurboEventEmitter {} return std::make_shared(params); } -- (void)setHost:(RCTHost *)host { - if (_host != nil) { - return; - } - _host = host; +- (void)addListener:(NSString *)eventName { + [super addListener:eventName]; + if ([eventName isEqualToString:AppLaunched]) { + _appLaunchedListenerCount++; + if (_appLaunchedEventDeferred) { + _appLaunchedEventDeferred = FALSE; + [self sendEventWithName:AppLaunched body:nil]; + } + } +} + +- (NSArray *)supportedEvents { + return @[ + AppLaunched, CommandCompleted, BottomTabSelected, BottomTabLongPressed, BottomTabPressed, + ComponentWillAppear, ComponentDidAppear, ComponentDidDisappear, NavigationButtonPressed, + ModalDismissed, SearchBarUpdated, SearchBarCancelPressed, PreviewCompleted, ScreenPopped, + ModalAttemptedToDismiss + ]; } - (void)send:(NSString *)eventName body:(id)body { - if (_host == nil) { - return; + if ([eventName isEqualToString:AppLaunched]) { + if (_appLaunchedListenerCount == 0) { + _appLaunchedEventDeferred = TRUE; + return; } - [self sendEventWithName:eventName body:body]; + } + + [self sendEventWithName:eventName body:body]; } @end diff --git a/lib/ios/TurboModules/RNNTurboManager.mm b/lib/ios/TurboModules/RNNTurboManager.mm index 18b8c73e66c..cd429d3fa54 100644 --- a/lib/ios/TurboModules/RNNTurboManager.mm +++ b/lib/ios/TurboModules/RNNTurboManager.mm @@ -3,7 +3,7 @@ #import "RNNTurboManager.h" #import "RNNCommandsHandler.h" #import "RNNComponentViewCreator.h" -#import "RNNTurboEventEmitter.h" +#import "RNNEventEmitter.h" #import "RNNLayoutManager.h" #import "RNNModalHostViewManagerHandler.h" #import "RNNReactComponentRegistry.h" @@ -20,7 +20,7 @@ @interface RNNTurboManager () @property(nonatomic, strong, readonly) RNNModalManager *modalManager; @property(nonatomic, strong, readonly) RNNModalHostViewManagerHandler *modalHostViewHandler; @property(nonatomic, strong, readonly) RNNCommandsHandler *commandsHandler; -@property(nonatomic, strong, readonly) RNNTurboEventEmitter *eventEmitter; +@property(nonatomic, strong, readonly) RNNEventEmitter *eventEmitter; @end @@ -46,7 +46,7 @@ - (instancetype)initWithHost:(RCTHost *)host mainWindow:(UIWindow *)mainWindow { name:RCTJavaScriptWillStartLoadingNotification object:nil]; - _eventEmitter = [[_host moduleRegistry] moduleForName:"RNNTurboEventEmitter"]; + _eventEmitter = [[RNNEventEmitter alloc] init]; _eventEmitter.host = _host; RNNModalManagerEventHandler *modalManagerEventHandler = @@ -99,15 +99,16 @@ - (void)onJavaScriptWillLoad { } - (void)onJavaScriptLoaded { - [_commandsHandler setReadyToReceiveCommands:true]; - // TODO: Refactor -// [_modalHostViewHandler -// connectModalHostViewManager:[[_host moduleRegistry] moduleForName:"RCTModalHostViewManager"]]; - // TODO: Possibly will cause crashes in events with previous copy of emitter, need to test - _eventEmitter = [[_host moduleRegistry] moduleForName:"RNNTurboEventEmitter"]; - _eventEmitter.host = _host; - - [_eventEmitter sendOnAppLaunched]; + RCTExecuteOnMainQueue(^{ + UIApplication.sharedApplication.delegate.window.rootViewController = nil; + + [self->_commandsHandler setReadyToReceiveCommands:true]; + // TODO: Refactor + // [_modalHostViewHandler + // connectModalHostViewManager:[[_host moduleRegistry] moduleForName:"RCTModalHostViewManager"]]; + + [self->_eventEmitter sendOnAppLaunched]; + }); } @end diff --git a/lib/ios/UINavigationController+RNNCommands.mm b/lib/ios/UINavigationController+RNNCommands.mm index 668addaca54..2c5b1c470eb 100644 --- a/lib/ios/UINavigationController+RNNCommands.mm +++ b/lib/ios/UINavigationController+RNNCommands.mm @@ -41,7 +41,7 @@ - (void)popAnimated:(BOOL)animated completion:^{ NSLog(@"Pop popAnimated completed"); if (poppedVC) { - NSLog(@"Pop popAnimated completion invokation"); + NSLog(@"Pop popAnimated completion invocation"); completion(); } else { NSLog(@"Pop rejection");