/* * 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 #import #import @protocol RCTCxxBridgeDelegate; @protocol RCTComponentViewFactoryComponentProvider; @protocol RCTTurboModuleManagerDelegate; @protocol RCTHostDelegate; @class RCTBridge; @class RCTHost; @class RCTRootView; @class RCTSurfacePresenterBridgeAdapter; NS_ASSUME_NONNULL_BEGIN #pragma mark - Blocks' definitions typedef UIView *_Nonnull ( ^RCTCreateRootViewWithBridgeBlock)(RCTBridge *bridge, NSString *moduleName, NSDictionary *initProps); typedef RCTBridge *_Nonnull ( ^RCTCreateBridgeWithDelegateBlock)(id delegate, NSDictionary *launchOptions); typedef void (^RCTCustomizeRootViewBlock)(UIView *rootView); typedef NSURL *_Nullable (^RCTSourceURLForBridgeBlock)(RCTBridge *bridge); typedef NSURL *_Nullable (^RCTBundleURLBlock)(void); typedef NSArray> *_Nonnull (^RCTExtraModulesForBridgeBlock)(RCTBridge *bridge); typedef NSDictionary *_Nonnull (^RCTExtraLazyModuleClassesForBridge)(RCTBridge *bridge); typedef BOOL (^RCTBridgeDidNotFindModuleBlock)(RCTBridge *bridge, NSString *moduleName); #pragma mark - RCTRootViewFactory Configuration @interface RCTRootViewFactoryConfiguration : NSObject /// This property controls whether the App will use the Fabric renderer of the New Architecture or not. @property (nonatomic, assign, readonly) BOOL fabricEnabled; /// This property controls whether React Native's new initialization layer is enabled. @property (nonatomic, assign, readonly) BOOL bridgelessEnabled; /// This method controls whether the `turboModules` feature of the New Architecture is turned on or off @property (nonatomic, assign, readonly) BOOL turboModuleEnabled; /// Return the bundle URL for the main bundle. @property (nonatomic, nonnull) RCTBundleURLBlock bundleURLBlock; /** * Use this method to initialize a new instance of `RCTRootViewFactoryConfiguration` by passing a `bundleURL` * * Which is the location of the JavaScript source file. When running from the packager * this should be an absolute URL, e.g. `http://localhost:8081/index.ios.bundle`. * When running from a locally bundled JS file, this should be a `file://` url * pointing to a path inside the app resources, e.g. `file://.../main.jsbundle`. * */ - (instancetype)initWithBundleURLBlock:(RCTBundleURLBlock)bundleURLBlock newArchEnabled:(BOOL)newArchEnabled turboModuleEnabled:(BOOL)turboModuleEnabled bridgelessEnabled:(BOOL)bridgelessEnabled NS_DESIGNATED_INITIALIZER __deprecated; - (instancetype)initWithBundleURL:(NSURL *)bundleURL newArchEnabled:(BOOL)newArchEnabled turboModuleEnabled:(BOOL)turboModuleEnabled bridgelessEnabled:(BOOL)bridgelessEnabled __deprecated; - (instancetype)initWithBundleURLBlock:(RCTBundleURLBlock)bundleURLBlock newArchEnabled:(BOOL)newArchEnabled; - (instancetype)initWithBundleURL:(NSURL *)bundleURL newArchEnabled:(BOOL)newArchEnabled; /** * Block that allows to override logic of creating root view instance. * It creates a `UIView` starting from a bridge, a module name and a set of initial properties. * By default, it is invoked using the bridge created by `RCTCreateBridgeWithDelegateBlock` (or the default * implementation) and the `moduleName` variable comes from `viewWithModuleName:initialProperties:launchOptions` of * `RCTRootViewFactory`. * * @parameter: bridge - an instance of the `RCTBridge` object. * @parameter: moduleName - the name of the app, used by Metro to resolve the module. * @parameter: initProps - a set of initial properties. * * @returns: a UIView properly configured with a bridge for React Native. */ @property (nonatomic, nullable) RCTCreateRootViewWithBridgeBlock createRootViewWithBridge; /** * Block that allows to override default behavior of creating bridge. * It should return `RCTBridge` using a delegate and some launch options. * * By default, it is invoked passing `self` as a delegate. * * @parameter: delegate - an object that implements the `RCTBridgeDelegate` protocol. * @parameter: launchOptions - a dictionary with a set of options. * * @returns: a newly created instance of RCTBridge. */ @property (nonatomic, nullable) RCTCreateBridgeWithDelegateBlock createBridgeWithDelegate; /** * Block that allows to customize the rootView that is passed to React Native. * * @parameter: rootView - The root view to customize. */ @property (nonatomic, nullable) RCTCustomizeRootViewBlock customizeRootView; #pragma mark - RCTBridgeDelegate blocks /** * Block that returns the location of the JavaScript source file. When running from the packager * this should be an absolute URL, e.g. `http://localhost:8081/index.ios.bundle`. * When running from a locally bundled JS file, this should be a `file://` url * pointing to a path inside the app resources, e.g. `file://.../main.jsbundle`. */ @property (nonatomic, nullable) RCTSourceURLForBridgeBlock sourceURLForBridge; /** * The bridge initializes any registered RCTBridgeModules automatically, however * if you wish to instantiate your own module instances, you can return them * from this block. * * Note: You should always return a new instance for each call, rather than * returning the same instance each time the bridge is reloaded. Module instances * should not be shared between bridges, and this may cause unexpected behavior. * * It is also possible to override standard modules with your own implementations * by returning a class with the same `moduleName` from this method, but this is * not recommended in most cases - if the module methods and behavior do not * match exactly, it may lead to bugs or crashes. */ @property (nonatomic, nullable) RCTExtraModulesForBridgeBlock extraModulesForBridge; /** * Retrieve the list of lazy-native-modules names for the given bridge. */ @property (nonatomic, nullable) RCTExtraLazyModuleClassesForBridge extraLazyModuleClassesForBridge; /** * The bridge will call this block when a module been called from JS * cannot be found among registered modules. * It should return YES if the module with name 'moduleName' was registered * in the implementation, and the system must attempt to look for it again among registered. * If the module was not registered, return NO to prevent further searches. */ @property (nonatomic, nullable) RCTBridgeDidNotFindModuleBlock bridgeDidNotFindModule; @end #pragma mark - RCTRootViewFactory /** * The RCTRootViewFactory is an utility class that encapsulates the logic of creating a new RCTRootView based on the * current state of the environment. It allows you to initialize your app root view for old architecture, new * architecture and bridgless mode. * * This class is used to initalize rootView in RCTAppDelegate, but you can also use it separately. * * Create a new instance of this class (make sure to retain it) and call the * `viewWithModuleName:initialProperties:launchOptions` method to create new RCTRootView. */ @interface RCTRootViewFactory : NSObject @property (nonatomic, strong, nullable) RCTBridge *bridge; @property (nonatomic, strong, nullable) RCTHost *reactHost; @property (nonatomic, strong, nullable) RCTSurfacePresenterBridgeAdapter *bridgeAdapter; - (instancetype)initWithConfiguration:(RCTRootViewFactoryConfiguration *)configuration andTurboModuleManagerDelegate:(id _Nullable)turboModuleManagerDelegate; - (instancetype)initWithConfiguration:(RCTRootViewFactoryConfiguration *)configuration; - (instancetype)initWithTurboModuleDelegate:(id)turboModuleManagerDelegate hostDelegate:(id)hostdelegate configuration:(RCTRootViewFactoryConfiguration *)configuration; /** * This method can be used to create new RCTRootViews on demand. * * @parameter: moduleName - the name of the app, used by Metro to resolve the module. * @parameter: initialProperties - a set of initial properties. * @parameter: launchOptions - a dictionary with a set of options. */ - (UIView *_Nonnull)viewWithModuleName:(NSString *)moduleName initialProperties:(NSDictionary *__nullable)initialProperties launchOptions:(NSDictionary *__nullable)launchOptions; - (UIView *_Nonnull)viewWithModuleName:(NSString *)moduleName initialProperties:(NSDictionary *__nullable)initialProperties; - (UIView *_Nonnull)viewWithModuleName:(NSString *)moduleName; #pragma mark - RCTRootViewFactory Helpers - (RCTHost *)createReactHost:(NSDictionary *__nullable)launchOptions; @end NS_ASSUME_NONNULL_END