forked from wix/react-native-navigation
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This PR updates autolink script for both Android and iOS to make them compatible with RN 0.69 It should fix wix#7564 and also tackle an issue commented in wix#7547 I've also added some snapshot tests for the modified files (`activityLinker.js` and `appDeletegateLinker.js`). In order to do so, some fixtures were added: `MainActivity.java` and `AppDelegate.mm` files for RN 0.68 and 0.69 These tests execution is included in `test-all` command, but could be removed if necessary. Co-authored-by: Gonzalo Aguirre <[email protected]>
- Loading branch information
Showing
15 changed files
with
821 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
#import "AppDelegate.h" | ||
|
||
#import <React/RCTBridge.h> | ||
#import <React/RCTBundleURLProvider.h> | ||
#import <React/RCTRootView.h> | ||
|
||
#import <React/RCTAppSetupUtils.h> | ||
|
||
#if RCT_NEW_ARCH_ENABLED | ||
#import <React/CoreModulesPlugins.h> | ||
#import <React/RCTCxxBridgeDelegate.h> | ||
#import <React/RCTFabricSurfaceHostingProxyRootView.h> | ||
#import <React/RCTSurfacePresenter.h> | ||
#import <React/RCTSurfacePresenterBridgeAdapter.h> | ||
#import <ReactCommon/RCTTurboModuleManager.h> | ||
|
||
#import <react/config/ReactNativeConfig.h> | ||
|
||
@interface AppDelegate () <RCTCxxBridgeDelegate, RCTTurboModuleManagerDelegate> { | ||
RCTTurboModuleManager *_turboModuleManager; | ||
RCTSurfacePresenterBridgeAdapter *_bridgeAdapter; | ||
std::shared_ptr<const facebook::react::ReactNativeConfig> _reactNativeConfig; | ||
facebook::react::ContextContainer::Shared _contextContainer; | ||
} | ||
@end | ||
#endif | ||
|
||
@implementation AppDelegate | ||
|
||
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions | ||
{ | ||
RCTAppSetupPrepareApp(application); | ||
|
||
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; | ||
|
||
#if RCT_NEW_ARCH_ENABLED | ||
_contextContainer = std::make_shared<facebook::react::ContextContainer const>(); | ||
_reactNativeConfig = std::make_shared<facebook::react::EmptyReactNativeConfig const>(); | ||
_contextContainer->insert("ReactNativeConfig", _reactNativeConfig); | ||
_bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer]; | ||
bridge.surfacePresenter = _bridgeAdapter.surfacePresenter; | ||
#endif | ||
|
||
UIView *rootView = RCTAppSetupDefaultRootView(bridge, @"app", nil); | ||
|
||
if (@available(iOS 13.0, *)) { | ||
rootView.backgroundColor = [UIColor systemBackgroundColor]; | ||
} else { | ||
rootView.backgroundColor = [UIColor whiteColor]; | ||
} | ||
|
||
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; | ||
UIViewController *rootViewController = [UIViewController new]; | ||
rootViewController.view = rootView; | ||
self.window.rootViewController = rootViewController; | ||
[self.window makeKeyAndVisible]; | ||
return YES; | ||
} | ||
|
||
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge | ||
{ | ||
#if DEBUG | ||
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; | ||
#else | ||
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; | ||
#endif | ||
} | ||
|
||
#if RCT_NEW_ARCH_ENABLED | ||
|
||
#pragma mark - RCTCxxBridgeDelegate | ||
|
||
- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge | ||
{ | ||
_turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge | ||
delegate:self | ||
jsInvoker:bridge.jsCallInvoker]; | ||
return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager); | ||
} | ||
|
||
#pragma mark RCTTurboModuleManagerDelegate | ||
|
||
- (Class)getModuleClassFromName:(const char *)name | ||
{ | ||
return RCTCoreModulesClassProvider(name); | ||
} | ||
|
||
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name | ||
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker | ||
{ | ||
return nullptr; | ||
} | ||
|
||
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name | ||
initParams: | ||
(const facebook::react::ObjCTurboModule::InitParams &)params | ||
{ | ||
return nullptr; | ||
} | ||
|
||
- (id<RCTTurboModule>)getModuleInstanceFromClass:(Class)moduleClass | ||
{ | ||
return RCTAppSetupDefaultModuleFromClass(moduleClass); | ||
} | ||
|
||
#endif | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
package com.app; | ||
|
||
import com.facebook.react.ReactActivity; | ||
import com.facebook.react.ReactActivityDelegate; | ||
import com.facebook.react.ReactRootView; | ||
|
||
public class MainActivity extends ReactActivity { | ||
|
||
/** | ||
* Returns the name of the main component registered from JavaScript. This is used to schedule | ||
* rendering of the component. | ||
*/ | ||
@Override | ||
protected String getMainComponentName() { | ||
return "app"; | ||
} | ||
|
||
/** | ||
* Returns the instance of the {@link ReactActivityDelegate}. There the RootView is created and | ||
* you can specify the rendered you wish to use (Fabric or the older renderer). | ||
*/ | ||
@Override | ||
protected ReactActivityDelegate createReactActivityDelegate() { | ||
return new MainActivityDelegate(this, getMainComponentName()); | ||
} | ||
|
||
public static class MainActivityDelegate extends ReactActivityDelegate { | ||
public MainActivityDelegate(ReactActivity activity, String mainComponentName) { | ||
super(activity, mainComponentName); | ||
} | ||
|
||
@Override | ||
protected ReactRootView createRootView() { | ||
ReactRootView reactRootView = new ReactRootView(getContext()); | ||
// If you opted-in for the New Architecture, we enable the Fabric Renderer. | ||
reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED); | ||
return reactRootView; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,133 @@ | ||
#import "AppDelegate.h" | ||
|
||
#import <React/RCTBridge.h> | ||
#import <React/RCTBundleURLProvider.h> | ||
#import <React/RCTRootView.h> | ||
|
||
#import <React/RCTAppSetupUtils.h> | ||
|
||
#if RCT_NEW_ARCH_ENABLED | ||
#import <React/CoreModulesPlugins.h> | ||
#import <React/RCTCxxBridgeDelegate.h> | ||
#import <React/RCTFabricSurfaceHostingProxyRootView.h> | ||
#import <React/RCTSurfacePresenter.h> | ||
#import <React/RCTSurfacePresenterBridgeAdapter.h> | ||
#import <ReactCommon/RCTTurboModuleManager.h> | ||
|
||
#import <react/config/ReactNativeConfig.h> | ||
|
||
static NSString *const kRNConcurrentRoot = @"concurrentRoot"; | ||
|
||
@interface AppDelegate () <RCTCxxBridgeDelegate, RCTTurboModuleManagerDelegate> { | ||
RCTTurboModuleManager *_turboModuleManager; | ||
RCTSurfacePresenterBridgeAdapter *_bridgeAdapter; | ||
std::shared_ptr<const facebook::react::ReactNativeConfig> _reactNativeConfig; | ||
facebook::react::ContextContainer::Shared _contextContainer; | ||
} | ||
@end | ||
#endif | ||
|
||
@implementation AppDelegate | ||
|
||
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions | ||
{ | ||
RCTAppSetupPrepareApp(application); | ||
|
||
RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; | ||
|
||
#if RCT_NEW_ARCH_ENABLED | ||
_contextContainer = std::make_shared<facebook::react::ContextContainer const>(); | ||
_reactNativeConfig = std::make_shared<facebook::react::EmptyReactNativeConfig const>(); | ||
_contextContainer->insert("ReactNativeConfig", _reactNativeConfig); | ||
_bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer]; | ||
bridge.surfacePresenter = _bridgeAdapter.surfacePresenter; | ||
#endif | ||
|
||
NSDictionary *initProps = [self prepareInitialProps]; | ||
UIView *rootView = RCTAppSetupDefaultRootView(bridge, @"app", initProps); | ||
|
||
if (@available(iOS 13.0, *)) { | ||
rootView.backgroundColor = [UIColor systemBackgroundColor]; | ||
} else { | ||
rootView.backgroundColor = [UIColor whiteColor]; | ||
} | ||
|
||
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; | ||
UIViewController *rootViewController = [UIViewController new]; | ||
rootViewController.view = rootView; | ||
self.window.rootViewController = rootViewController; | ||
[self.window makeKeyAndVisible]; | ||
return YES; | ||
} | ||
|
||
/// This method controls whether the `concurrentRoot`feature of React18 is turned on or off. | ||
/// | ||
/// @see: https://reactjs.org/blog/2022/03/29/react-v18.html | ||
/// @note: This requires to be rendering on Fabric (i.e. on the New Architecture). | ||
/// @return: `true` if the `concurrentRoot` feture is enabled. Otherwise, it returns `false`. | ||
- (BOOL)concurrentRootEnabled | ||
{ | ||
// Switch this bool to turn on and off the concurrent root | ||
return true; | ||
} | ||
|
||
- (NSDictionary *)prepareInitialProps | ||
{ | ||
NSMutableDictionary *initProps = [NSMutableDictionary new]; | ||
|
||
#ifdef RCT_NEW_ARCH_ENABLED | ||
initProps[kRNConcurrentRoot] = @([self concurrentRootEnabled]); | ||
#endif | ||
|
||
return initProps; | ||
} | ||
|
||
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge | ||
{ | ||
#if DEBUG | ||
return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"]; | ||
#else | ||
return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; | ||
#endif | ||
} | ||
|
||
#if RCT_NEW_ARCH_ENABLED | ||
|
||
#pragma mark - RCTCxxBridgeDelegate | ||
|
||
- (std::unique_ptr<facebook::react::JSExecutorFactory>)jsExecutorFactoryForBridge:(RCTBridge *)bridge | ||
{ | ||
_turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge | ||
delegate:self | ||
jsInvoker:bridge.jsCallInvoker]; | ||
return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager); | ||
} | ||
|
||
#pragma mark RCTTurboModuleManagerDelegate | ||
|
||
- (Class)getModuleClassFromName:(const char *)name | ||
{ | ||
return RCTCoreModulesClassProvider(name); | ||
} | ||
|
||
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name | ||
jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)jsInvoker | ||
{ | ||
return nullptr; | ||
} | ||
|
||
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModule:(const std::string &)name | ||
initParams: | ||
(const facebook::react::ObjCTurboModule::InitParams &)params | ||
{ | ||
return nullptr; | ||
} | ||
|
||
- (id<RCTTurboModule>)getModuleInstanceFromClass:(Class)moduleClass | ||
{ | ||
return RCTAppSetupDefaultModuleFromClass(moduleClass); | ||
} | ||
|
||
#endif | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
package com.app; | ||
|
||
import com.facebook.react.ReactActivity; | ||
import com.facebook.react.ReactActivityDelegate; | ||
import com.facebook.react.ReactRootView; | ||
|
||
public class MainActivity extends ReactActivity { | ||
|
||
/** | ||
* Returns the name of the main component registered from JavaScript. This is used to schedule | ||
* rendering of the component. | ||
*/ | ||
@Override | ||
protected String getMainComponentName() { | ||
return "app"; | ||
} | ||
|
||
/** | ||
* Returns the instance of the {@link ReactActivityDelegate}. There the RootView is created and | ||
* you can specify the renderer you wish to use - the new renderer (Fabric) or the old renderer | ||
* (Paper). | ||
*/ | ||
@Override | ||
protected ReactActivityDelegate createReactActivityDelegate() { | ||
return new MainActivityDelegate(this, getMainComponentName()); | ||
} | ||
|
||
public static class MainActivityDelegate extends ReactActivityDelegate { | ||
public MainActivityDelegate(ReactActivity activity, String mainComponentName) { | ||
super(activity, mainComponentName); | ||
} | ||
|
||
@Override | ||
protected ReactRootView createRootView() { | ||
ReactRootView reactRootView = new ReactRootView(getContext()); | ||
// If you opted-in for the New Architecture, we enable the Fabric Renderer. | ||
reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED); | ||
return reactRootView; | ||
} | ||
|
||
@Override | ||
protected boolean isConcurrentRootEnabled() { | ||
// If you opted-in for the New Architecture, we enable Concurrent Root (i.e. React 18). | ||
// More on this on https://reactjs.org/blog/2022/03/29/react-v18.html | ||
return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; | ||
} | ||
} | ||
} |
Oops, something went wrong.