From 2c268d7fe65e0e6c143dbce3a771bbf5880a56db Mon Sep 17 00:00:00 2001 From: Paige Sun Date: Wed, 2 Mar 2022 14:09:56 -0800 Subject: [PATCH] 2/3 Make interop WebView component Bridgeless compatible, and make `uiManager addUIBlock` migration easier Summary: Changelog: [iOS] Add `_viewRegistry_DEPRECATED addUIBlock` to replace `uiManager addUIBlock` for Fabric migration Allow people to directly replace `uiManager addUIBlock` with `_viewRegistry_DEPRECATED addUIBlock` when they migrate the method in RCTViewManagers. Currently we add an if check in the RCTViewManager, which makes migration a bit harder for OSS. ``` if (self.bridge) { [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { work(); }]; } else { RCTExecuteOnMainQueue(work); } ``` Reviewed By: sammy-SC Differential Revision: D34532609 fbshipit-source-id: 19647fea03be8fd71d8f46dfe216275894d8165c --- React/Base/RCTBridgeModule.h | 3 +++ React/Base/RCTViewRegistry.m | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/React/Base/RCTBridgeModule.h b/React/Base/RCTBridgeModule.h index 971973a9b33..ae2066f16f4 100644 --- a/React/Base/RCTBridgeModule.h +++ b/React/Base/RCTBridgeModule.h @@ -437,6 +437,8 @@ typedef NSURL * (^RCTBridgelessBundleURLGetter)(void); typedef UIView * (^RCTBridgelessComponentViewProvider)(NSNumber *); +typedef void (^RCTViewRegistryUIBlock)(RCTViewRegistry *viewRegistry); + /** * A class that allows NativeModules to query for views, given React Tags. */ @@ -445,6 +447,7 @@ typedef UIView * (^RCTBridgelessComponentViewProvider)(NSNumber *); - (void)setBridgelessComponentViewProvider:(RCTBridgelessComponentViewProvider)bridgelessComponentViewProvider; - (UIView *)viewForReactTag:(NSNumber *)reactTag; +- (void)addUIBlock:(RCTViewRegistryUIBlock)block; @end typedef void (^RCTBridgelessJSModuleMethodInvoker)( diff --git a/React/Base/RCTViewRegistry.m b/React/Base/RCTViewRegistry.m index f93275dc799..dc54d78c686 100644 --- a/React/Base/RCTViewRegistry.m +++ b/React/Base/RCTViewRegistry.m @@ -42,4 +42,28 @@ return view; } +- (void)addUIBlock:(RCTViewRegistryUIBlock)block +{ + if (!block) { + return; + } + + __weak __typeof(self) weakSelf = self; + if (_bridge) { + [_bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary *viewRegistry) { + __typeof(self) strongSelf = weakSelf; + if (strongSelf) { + block(strongSelf); + } + }]; + } else { + RCTExecuteOnMainQueue(^{ + __typeof(self) strongSelf = weakSelf; + if (strongSelf) { + block(strongSelf); + } + }); + } +} + @end