/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ #import "RCTAppDelegate.h" #import #import #import #import #import "RCTAppSetupUtils.h" #if RCT_NEW_ARCH_ENABLED #import #import #import #import #import #import #import #import #import #import #import "RCTLegacyInteropComponents.h" static NSString *const kRNConcurrentRoot = @"concurrentRoot"; @interface RCTAppDelegate () { std::shared_ptr _reactNativeConfig; facebook::react::ContextContainer::Shared _contextContainer; } @end #endif @interface RCTAppDelegate () { std::shared_ptr _runtimeScheduler; } @end @implementation RCTAppDelegate #if RCT_NEW_ARCH_ENABLED - (instancetype)init { if (self = [super init]) { _contextContainer = std::make_shared(); _reactNativeConfig = std::make_shared(); _contextContainer->insert("ReactNativeConfig", _reactNativeConfig); } return self; } #endif - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { BOOL enableTM = NO; #if RCT_NEW_ARCH_ENABLED enableTM = self.turboModuleEnabled; #endif RCTAppSetupPrepareApp(application, enableTM); if (!self.bridge) { self.bridge = [self createBridgeWithDelegate:self launchOptions:launchOptions]; } #if RCT_NEW_ARCH_ENABLED self.bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:self.bridge contextContainer:_contextContainer]; self.bridge.surfacePresenter = self.bridgeAdapter.surfacePresenter; [self unstable_registerLegacyComponents]; #endif NSDictionary *initProps = [self prepareInitialProps]; UIView *rootView = [self createRootViewWithBridge:self.bridge moduleName:self.moduleName initProps:initProps]; self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; UIViewController *rootViewController = [self createRootViewController]; rootViewController.view = rootView; self.window.rootViewController = rootViewController; [self.window makeKeyAndVisible]; return YES; } - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge { [NSException raise:@"RCTBridgeDelegate::sourceURLForBridge not implemented" format:@"Subclasses must implement a valid sourceURLForBridge method"]; return nil; } - (NSDictionary *)prepareInitialProps { NSMutableDictionary *initProps = self.initialProps ? [self.initialProps mutableCopy] : [NSMutableDictionary new]; #ifdef RCT_NEW_ARCH_ENABLED // Hardcoding the Concurrent Root as it it not recommended to // have the concurrentRoot turned off when Fabric is enabled. initProps[kRNConcurrentRoot] = @([self fabricEnabled]); #endif return initProps; } - (RCTBridge *)createBridgeWithDelegate:(id)delegate launchOptions:(NSDictionary *)launchOptions { return [[RCTBridge alloc] initWithDelegate:delegate launchOptions:launchOptions]; } - (UIView *)createRootViewWithBridge:(RCTBridge *)bridge moduleName:(NSString *)moduleName initProps:(NSDictionary *)initProps { BOOL enableFabric = NO; #if RCT_NEW_ARCH_ENABLED enableFabric = self.fabricEnabled; #endif UIView *rootView = RCTAppSetupDefaultRootView(bridge, moduleName, initProps, enableFabric); if (@available(iOS 13.0, *)) { rootView.backgroundColor = [UIColor systemBackgroundColor]; } else { rootView.backgroundColor = [UIColor whiteColor]; } return rootView; } - (UIViewController *)createRootViewController { return [UIViewController new]; } - (BOOL)runtimeSchedulerEnabled { return YES; } #pragma mark - RCTCxxBridgeDelegate - (std::unique_ptr)jsExecutorFactoryForBridge:(RCTBridge *)bridge { #if RCT_NEW_ARCH_ENABLED _runtimeScheduler = std::make_shared(RCTRuntimeExecutorFromBridge(bridge)); std::shared_ptr callInvoker = std::make_shared(_runtimeScheduler); self.turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge delegate:self jsInvoker:callInvoker]; _contextContainer->erase("RuntimeScheduler"); _contextContainer->insert("RuntimeScheduler", _runtimeScheduler); return RCTAppSetupDefaultJsExecutorFactory(bridge, self.turboModuleManager, _runtimeScheduler); #else if (self.runtimeSchedulerEnabled) { _runtimeScheduler = std::make_shared(RCTRuntimeExecutorFromBridge(bridge)); } return RCTAppSetupJsExecutorFactoryForOldArch(bridge, _runtimeScheduler); #endif } #if RCT_NEW_ARCH_ENABLED #pragma mark - RCTTurboModuleManagerDelegate - (Class)getModuleClassFromName:(const char *)name { return RCTCoreModulesClassProvider(name); } - (std::shared_ptr)getTurboModule:(const std::string &)name jsInvoker:(std::shared_ptr)jsInvoker { return nullptr; } - (std::shared_ptr)getTurboModule:(const std::string &)name initParams: (const facebook::react::ObjCTurboModule::InitParams &)params { return nullptr; } - (id)getModuleInstanceFromClass:(Class)moduleClass { return RCTAppSetupDefaultModuleFromClass(moduleClass); } #pragma mark - New Arch Enabled settings - (BOOL)turboModuleEnabled { return YES; } - (BOOL)fabricEnabled { return YES; } #pragma mark - New Arch Utilities - (void)unstable_registerLegacyComponents { for (NSString *legacyComponent in [RCTLegacyInteropComponents legacyInteropComponents]) { [RCTLegacyViewManagerInteropComponentView supportLegacyViewManagerWithName:legacyComponent]; } } #endif @end