diff --git a/React/Base/RCTBridge.h b/React/Base/RCTBridge.h index 87c1a616bd1..49b355f2736 100644 --- a/React/Base/RCTBridge.h +++ b/React/Base/RCTBridge.h @@ -231,6 +231,13 @@ RCT_EXTERN void RCTEnableTurboModuleBlockGuard(BOOL enabled); */ - (void)setRCTTurboModuleRegistry:(id)turboModuleRegistry; +/** + * This hook is called by the TurboModule infra with every TurboModule that's created. + * It allows the bridge to attach properties to TurboModules that give TurboModules + * access to Bridge APIs. + */ +- (void)attachBridgeAPIsToTurboModule:(id)module; + /** * Convenience method for retrieving all modules conforming to a given protocol. * Modules will be synchronously instantiated if they haven't already been, diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index f036dfd3378..585aa00c831 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -230,6 +230,11 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init) [self.batchedBridge setRCTTurboModuleRegistry:turboModuleRegistry]; } +- (void)attachBridgeAPIsToTurboModule:(id)module +{ + [self.batchedBridge attachBridgeAPIsToTurboModule:module]; +} + - (void)didReceiveReloadCommand { #if RCT_ENABLE_INSPECTOR diff --git a/React/Base/RCTBridgeModule.h b/React/Base/RCTBridgeModule.h index b8d3ea6ee71..c7a1888b0dd 100644 --- a/React/Base/RCTBridgeModule.h +++ b/React/Base/RCTBridgeModule.h @@ -133,7 +133,7 @@ RCT_EXTERN_C_END * viewRegistry_DEPRECATED = _viewRegistry_DEPRECATED;`. If using Swift, add * `@objc var viewRegistry_DEPRECATED: RCTViewRegistry!` to your module. */ -@property (nonatomic, weak, readonly) RCTViewRegistry *viewRegistry_DEPRECATED; +@property (nonatomic, weak, readwrite) RCTViewRegistry *viewRegistry_DEPRECATED; /** * A reference to the RCTBridge. Useful for modules that require access diff --git a/React/CxxBridge/RCTCxxBridge.mm b/React/CxxBridge/RCTCxxBridge.mm index be1798f1939..bf8050a55b6 100644 --- a/React/CxxBridge/RCTCxxBridge.mm +++ b/React/CxxBridge/RCTCxxBridge.mm @@ -249,6 +249,21 @@ struct RCTInstanceCallback : public InstanceCallback { [_objCModuleRegistry setTurboModuleRegistry:_turboModuleRegistry]; } +- (void)attachBridgeAPIsToTurboModule:(id)module +{ + id bridgeModule = (id)module; + /** + * Attach the RCTViewRegistry to this TurboModule, which allows this TurboModule + * To query a React component's UIView, given its reactTag. + * + * Usage: In the NativeModule @implementation, include: + * `@synthesize viewRegistry_DEPRECATED = _viewRegistry_DEPRECATED` + */ + if ([bridgeModule respondsToSelector:@selector(setViewRegistry_DEPRECATED:)]) { + bridgeModule.viewRegistry_DEPRECATED = _viewRegistry_DEPRECATED; + } +} + - (std::shared_ptr)jsMessageThread { return _jsMessageThread; diff --git a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.h b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.h index 5e112440b8c..2b9c4731940 100644 --- a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.h +++ b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.h @@ -45,7 +45,6 @@ jsInvoker:(std::shared_ptr)jsInvoker; - (void)installJSBindingWithRuntimeExecutor:(facebook::react::RuntimeExecutor)runtimeExecutor; -- (void)setBridgelessComponentViewProvider:(RCTBridgelessComponentViewProvider)bridgelessComponentViewProvider; - (void)invalidate; diff --git a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm index 2b0c450b538..619e443440c 100644 --- a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm +++ b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm @@ -174,7 +174,6 @@ static Class getFallbackClassFromName(const char *name) std::atomic _invalidating; RCTModuleRegistry *_moduleRegistry; - RCTViewRegistry *_viewRegistry_DEPRECATED; } - (instancetype)initWithBridge:(RCTBridge *)bridge @@ -190,9 +189,6 @@ static Class getFallbackClassFromName(const char *name) [_moduleRegistry setBridge:bridge]; [_moduleRegistry setTurboModuleRegistry:self]; - _viewRegistry_DEPRECATED = [RCTViewRegistry new]; - [_viewRegistry_DEPRECATED setBridge:bridge]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(bridgeWillInvalidateModules:) name:RCTBridgeWillInvalidateModulesNotification @@ -205,11 +201,6 @@ static Class getFallbackClassFromName(const char *name) return self; } -- (void)setBridgelessComponentViewProvider:(RCTBridgelessComponentViewProvider)viewProvider -{ - [_viewRegistry_DEPRECATED setBridgelessComponentViewProvider:viewProvider]; -} - - (void)notifyAboutTurboModuleSetup:(const char *)name { NSString *moduleName = [[NSString alloc] initWithUTF8String:name]; @@ -563,25 +554,6 @@ static Class getFallbackClassFromName(const char *name) } } - /** - * Attach the RCTViewRegistry to this TurboModule, which allows this TurboModule - * To query a React component's UIView, given its reactTag. - * - * Usage: In the NativeModule @implementation, include: - * `@synthesize viewRegistry_DEPRECATED = _viewRegistry_DEPRECATED` - */ - if ([module respondsToSelector:@selector(viewRegistry_DEPRECATED)] && _viewRegistry_DEPRECATED) { - @try { - [(id)module setValue:_viewRegistry_DEPRECATED forKey:@"viewRegistry_DEPRECATED"]; - } @catch (NSException *exception) { - RCTLogError( - @"%@ has no setter or ivar for its module registry, which is not " - "permitted. You must either @synthesize the viewRegistry_DEPRECATED property, " - "or provide your own setter method.", - RCTBridgeModuleNameForClass([module class])); - } - } - /** * Some modules need their own queues, but don't provide any, so we need to create it for them. * These modules typically have the following: @@ -626,6 +598,13 @@ static Class getFallbackClassFromName(const char *name) } } + /** + * Decorate TurboModules with bridgeless-compatible APIs that call into the bridge. + */ + if (_bridge) { + [_bridge attachBridgeAPIsToTurboModule:module]; + } + /** * Attach method queue to id object. * This is necessary because the id object can be eagerly created/initialized before the method @@ -645,7 +624,7 @@ static Class getFallbackClassFromName(const char *name) RCTModuleData *data = [[RCTModuleData alloc] initWithModuleInstance:(id)module bridge:_bridge moduleRegistry:_moduleRegistry - viewRegistry_DEPRECATED:_viewRegistry_DEPRECATED]; + viewRegistry_DEPRECATED:nil]; [_bridge registerModuleForFrameUpdates:(id)module withModuleData:data]; }