Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .buildkite/jobs/pipeline.android_rn_83.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
- label: ":android: Android (RN 0.83.0)"
- label: ":android: Android (RN 0.83.2)"
env:
JAVA_HOME: /opt/openjdk/jdk-17.0.9.jdk/Contents/Home/
REACT_NATIVE_VERSION: 0.83.0
REACT_NATIVE_VERSION: 0.83.2
command:
- "nvm install"
- "./scripts/ci.android.sh"
Expand Down
13 changes: 13 additions & 0 deletions .buildkite/jobs/pipeline.android_rn_84.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# TODO(2026-03-13): bump to 0.84.1 once it clears the embargo (released 2026-02-27)
- label: ":android: Android (RN 0.84.0)"
env:
JAVA_HOME: /opt/openjdk/jdk-17.0.9.jdk/Contents/Home/
REACT_NATIVE_VERSION: 0.84.0
command:
- "nvm install"
- "./scripts/ci.android.sh"
key: "android_rn_84"
timeout_in_minutes: 90
artifact_paths: "/Users/builder/uibuilder/work/playground/artifacts/**/*"


4 changes: 2 additions & 2 deletions .buildkite/jobs/pipeline.ios_rn_83.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
- label: ":ios: iOS (RN 0.83.0)"
- label: ":ios: iOS (RN 0.83.2)"
env:
REACT_NATIVE_VERSION: 0.83.0
REACT_NATIVE_VERSION: 0.83.2
command:
- "nvm install"
- "./scripts/ci.ios.sh"
Expand Down
12 changes: 12 additions & 0 deletions .buildkite/jobs/pipeline.ios_rn_84.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# TODO(2026-03-13): bump to 0.84.1 once it clears the embargo (released 2026-02-27)
- label: ":ios: iOS (RN 0.84.0)"
env:
REACT_NATIVE_VERSION: 0.84.0
command:
- "nvm install"
- "./scripts/ci.ios.sh"
key: "ios_rn_84"
timeout_in_minutes: 90
artifact_paths: "/Users/builder/uibuilder/work/playground/artifacts/**/*"


2 changes: 2 additions & 0 deletions .buildkite/pipeline.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@ cat .buildkite/jobs/pipeline.android_rn_77.yml
cat .buildkite/jobs/pipeline.android_rn_78.yml
cat .buildkite/jobs/pipeline.android_rn_82.yml
cat .buildkite/jobs/pipeline.android_rn_83.yml
cat .buildkite/jobs/pipeline.android_rn_84.yml
cat .buildkite/jobs/pipeline.ios_rn_77.yml
cat .buildkite/jobs/pipeline.ios_rn_78.yml
cat .buildkite/jobs/pipeline.ios_rn_82.yml
cat .buildkite/jobs/pipeline.ios_rn_83.yml
cat .buildkite/jobs/pipeline.ios_rn_84.yml
cat .buildkite/jobs/pipeline.publish.yml
364 changes: 364 additions & 0 deletions .claude/skills/rn-version-upgrade.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -232,11 +232,11 @@ protected NavigationActivity activity() {
}

@Override
public void onCatalystInstanceDestroy() {
public void invalidate() {
final NavigationActivity navigationActivity = activity();
if (navigationActivity != null) {
navigationActivity.onCatalystInstanceDestroy();
}
super.onCatalystInstanceDestroy();
super.invalidate();
}
}
4 changes: 4 additions & 0 deletions ios/RCTHelpers.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#import <Foundation/Foundation.h>
#ifndef RCT_NEW_ARCH_ENABLED
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No need to add RCT_NEW_ARCH_ENABLED, we only support NEW_ARCH since RN 0.76. Especially DON'T add #ifndef RCT_NEW_ARCH_ENABLED
So please remove all RCT_NEW_ARCH_ENABLED flags you added.

#import <React/RCTRootView.h>
#endif

@interface RCTHelpers : NSObject
+ (NSMutableDictionary *)textAttributesFromDictionary:(NSDictionary *)dictionary
Expand All @@ -8,5 +10,7 @@
withPrefix:(NSString *)prefix
baseFont:(UIFont *)font;
+ (NSString *)getTimestampString;
#ifndef RCT_NEW_ARCH_ENABLED
+ (BOOL)removeYellowBox:(RCTRootView *)reactRootView;
#endif
@end
4 changes: 4 additions & 0 deletions ios/RCTHelpers.mm
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#import "RCTHelpers.h"
#import <React/RCTFont.h>
#ifndef RCT_NEW_ARCH_ENABLED
#import <React/RCTScrollView.h>
#endif
#import <React/RCTView.h>

@implementation RCTHelpers
Expand Down Expand Up @@ -182,6 +184,7 @@ noticeable in RCCLightBox and RCCNotification where button (for example) are
not clickable if placed at the bottom part of the view
*/

#ifndef RCT_NEW_ARCH_ENABLED
+ (BOOL)removeYellowBox:(RCTRootView *)reactRootView {
#ifndef DEBUG
return YES;
Expand Down Expand Up @@ -220,5 +223,6 @@ + (BOOL)removeYellowBox:(RCTRootView *)reactRootView {

return removed;
}
#endif

@end
28 changes: 13 additions & 15 deletions ios/RNNAppDelegate.mm
Original file line number Diff line number Diff line change
@@ -1,34 +1,32 @@
#import "RNNAppDelegate.h"
#import <ReactNativeNavigation/ReactNativeNavigation.h>
#import <react/featureflags/ReactNativeFeatureFlags.h>
#import <react/featureflags/ReactNativeFeatureFlagsDefaults.h>

#import "RCTAppSetupUtils.h"

#if !RNN_RN_VERSION_79_OR_NEWER
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also here, no need to add or change lower version support because it is already handled and working.

// Legacy path (RN < 0.79) — needs bridge, turbo module manager, feature flags
#import <React/CoreModulesPlugins.h>
#import <React/RCTBridge+Private.h>
#import <React/RCTBridgeProxy.h>
#import <React/RCTComponentViewFactory.h>
#import <React/RCTCxxBridgeDelegate.h>
#import <React/RCTImageLoader.h>
#import <React/RCTLegacyViewManagerInteropComponentView.h>
#import <React/RCTSurfacePresenter.h>
#import <React/RCTSurfacePresenterStub.h>
#import <React/RCTSurfacePresenterBridgeAdapter.h>
#import <React/RCTSurfacePresenterStub.h>
#import <ReactCommon/RCTTurboModuleManager.h>

#import <react/featureflags/ReactNativeFeatureFlags.h>
#import <react/featureflags/ReactNativeFeatureFlagsDefaults.h>
#if __has_include(<react/config/ReactNativeConfig.h>)
#import <react/config/ReactNativeConfig.h>
#endif

#import <react/renderer/runtimescheduler/RuntimeScheduler.h>
#import <react/renderer/runtimescheduler/RuntimeSchedulerCallInvoker.h>
#import <React/RCTSurfacePresenter.h>
#import <React/RCTBridge+Private.h>
#import <React/RCTImageLoader.h>
#import <React/RCTBridgeProxy.h>
#import <React/RCTSurfacePresenter.h>
#import <react/utils/ManagedObjectWrapper.h>

#import <React/RCTComponentViewFactory.h>


static NSString *const kRNConcurrentRoot = @"concurrentRoot";
#else
// Modern path (RN >= 0.79) — RCTAppSetupUtils.h imported above
#endif

#if !RNN_RN_VERSION_79_OR_NEWER
@interface RNNAppDelegate () <RCTTurboModuleManagerDelegate,
Expand Down
2 changes: 2 additions & 0 deletions ios/RNNBridgeManager.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#ifndef RCT_NEW_ARCH_ENABLED
#import <Foundation/Foundation.h>
#import <React/RCTBridge.h>

Expand All @@ -16,3 +17,4 @@ typedef UIViewController * (^RNNExternalViewCreator)(NSDictionary *props, RCTBri
- (UIViewController *)findComponentForId:(NSString *)componentId;

@end
#endif
2 changes: 2 additions & 0 deletions ios/RNNBridgeManager.mm
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#ifndef RCT_NEW_ARCH_ENABLED
#import "RNNBridgeManager.h"

#import "RNNBridgeModule.h"
Expand Down Expand Up @@ -121,3 +122,4 @@ - (void)onBridgeWillReload {
}

@end
#endif
23 changes: 13 additions & 10 deletions ios/RNNCommandsHandler.mm
Original file line number Diff line number Diff line change
Expand Up @@ -200,20 +200,23 @@ - (void)push:(NSString *)componentId
RCTExecuteOnMainQueue(^{
UIView *view = nil;
#ifdef RCT_NEW_ARCH_ENABLED
RCTHost *host = [ReactNativeNavigation getHost];

if (host != nil) {
view = [host.surfacePresenter.mountingManager.componentViewRegistry
findComponentViewWithTag: [optionsWithDefault.preview.reactTag.get integerValue]];
} else {
view = [[ReactNativeNavigation getBridge].uiManager
viewForReactTag:optionsWithDefault.preview.reactTag.get];
}
RCTHost *host = [ReactNativeNavigation getHost];
if (host != nil) {
view =
[host.surfacePresenter.mountingManager.componentViewRegistry
findComponentViewWithTag:[optionsWithDefault.preview
.reactTag
.get integerValue]];
}
#else
view = [[ReactNativeNavigation getBridge].uiManager
viewForReactTag:optionsWithDefault.preview.reactTag.get];
#endif
[rootVc registerForPreviewingWithDelegate:(id)rootVc sourceView:view];
if (view == nil) {
return;
}
[rootVc registerForPreviewingWithDelegate:(id)rootVc
sourceView:view];
});
}
} else {
Expand Down
3 changes: 2 additions & 1 deletion ios/RNNCustomTitleView.h
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
#import <React/RCTRootViewDelegate.h>
#import <UIKit/UIKit.h>
#import "RNNReactView.h"

#ifdef RCT_NEW_ARCH_ENABLED
#import <React/RCTSurfaceDelegate.h>
#import <React/RCTSurface.h>
#else
#import <React/RCTRootViewDelegate.h>
#endif

@interface RNNCustomTitleView : UIView <
Expand Down
3 changes: 2 additions & 1 deletion ios/RNNElementFinder.mm
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@
#import "RNNReactView.h"
#import <React/RCTSurfaceView.h>
#import <React/RCTUIManager.h>
#ifndef RCT_NEW_ARCH_ENABLED
#import <React/RCTRootView.h>
#import <React/RCTUIManager.h>
#endif

#ifdef RCT_NEW_ARCH_ENABLED
#import <React/RCTViewComponentView.h>
Expand Down
6 changes: 3 additions & 3 deletions ios/RNNExternalComponentStore.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@

@interface RNNExternalComponentStore : NSObject

- (void)registerExternalComponent:(NSString *)name callback:(RNNExternalViewCreator)callback;
- (UIViewController *)getExternalComponent:(RNNLayoutInfo *)layoutInfo bridge:(RCTBridge *)bridge;

#ifdef RCT_NEW_ARCH_ENABLED
- (void)registerExternalHostComponent:(NSString *)name callback:(RNNExternalHostViewCreator)callback;
- (UIViewController *)getExternalHostComponent:(RNNLayoutInfo *)layoutInfo host:(RCTHost *)host;
#else
- (void)registerExternalComponent:(NSString *)name callback:(RNNExternalViewCreator)callback;
- (UIViewController *)getExternalComponent:(RNNLayoutInfo *)layoutInfo bridge:(RCTBridge *)bridge;
#endif

@end
19 changes: 9 additions & 10 deletions ios/RNNExternalComponentStore.mm
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,6 @@ - (instancetype)init {
return self;
}

- (void)registerExternalComponent:(NSString *)name callback:(RNNExternalViewCreator)callback {
[_externalComponentCreators setObject:[callback copy] forKey:name];
}

- (UIViewController *)getExternalComponent:(RNNLayoutInfo *)layoutInfo bridge:(RCTBridge *)bridge {
RNNExternalViewCreator creator = [_externalComponentCreators objectForKey:layoutInfo.name];
return creator(layoutInfo.props, bridge);
}


#ifdef RCT_NEW_ARCH_ENABLED
- (void)registerExternalHostComponent:(NSString *)name callback:(RNNExternalHostViewCreator)callback {
[_externalComponentCreators setObject:[callback copy] forKey:name];
Expand All @@ -33,6 +23,15 @@ - (UIViewController *)getExternalHostComponent:(RNNLayoutInfo *)layoutInfo host:
RNNExternalHostViewCreator creator = [_externalComponentCreators objectForKey:layoutInfo.name];
return creator(layoutInfo.props, host);
}
#else
- (void)registerExternalComponent:(NSString *)name callback:(RNNExternalViewCreator)callback {
[_externalComponentCreators setObject:[callback copy] forKey:name];
}

- (UIViewController *)getExternalComponent:(RNNLayoutInfo *)layoutInfo bridge:(RCTBridge *)bridge {
RNNExternalViewCreator creator = [_externalComponentCreators objectForKey:layoutInfo.name];
return creator(layoutInfo.props, bridge);
}
#endif

@end
4 changes: 4 additions & 0 deletions ios/RNNModalHostViewManagerHandler.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
#import "RNNModalManager.h"
#import <Foundation/Foundation.h>
#ifndef RCT_NEW_ARCH_ENABLED
#import <React/RCTModalHostViewManager.h>
#endif

@interface RNNModalHostViewManagerHandler : NSObject

- (instancetype)initWithModalManager:(RNNModalManager *)modalManager;

#ifndef RCT_NEW_ARCH_ENABLED
- (void)connectModalHostViewManager:(RCTModalHostViewManager *)modalHostViewManager;
#endif

@end
2 changes: 2 additions & 0 deletions ios/RNNModalHostViewManagerHandler.mm
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ - (instancetype)initWithModalManager:(RNNModalManager *)modalManager {
return self;
}

#ifndef RCT_NEW_ARCH_ENABLED
- (void)connectModalHostViewManager:(RCTModalHostViewManager *)modalHostViewManager {
modalHostViewManager.presentationBlock =
^(UIViewController *reactViewController, UIViewController *viewController, BOOL animated,
Expand All @@ -36,5 +37,6 @@ - (void)connectModalHostViewManager:(RCTModalHostViewManager *)modalHostViewMana
}];
};
}
#endif

@end
1 change: 0 additions & 1 deletion ios/RNNOverlayOptions.mm
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
#import "RNNOverlayOptions.h"
#import <React/RCTRootView.h>

@implementation RNNOverlayOptions

Expand Down
13 changes: 10 additions & 3 deletions ios/RNNOverlayWindow.mm
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
#import "RNNOverlayWindow.h"
#import "RNNReactView.h"
#import <React/RCTModalHostView.h>

@implementation RNNOverlayWindow

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
static Class modalHostViewClass;
static Class rootComponentViewClass;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
modalHostViewClass = NSClassFromString(@"RCTModalHostView");
rootComponentViewClass = NSClassFromString(@"RCTRootComponentView");
});

UIView *hitTestResult = [super hitTest:point withEvent:event];

if ([hitTestResult isKindOfClass:[UIWindow class]] ||
[hitTestResult.subviews.firstObject isKindOfClass:RNNReactView.class] ||
[hitTestResult isKindOfClass:[RCTModalHostView class]] ||
[hitTestResult isKindOfClass:NSClassFromString(@"RCTRootComponentView")]) {
[hitTestResult isKindOfClass:modalHostViewClass] ||
[hitTestResult isKindOfClass:rootComponentViewClass]) {
return nil;
}

Expand Down
5 changes: 4 additions & 1 deletion ios/RNNReactTitleView.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#import "RNNComponentView.h"

@interface RNNReactTitleView : RNNComponentView <RCTRootViewDelegate>
@interface RNNReactTitleView : RNNComponentView
#ifndef RCT_NEW_ARCH_ENABLED
<RCTRootViewDelegate>
#endif

- (void)setAlignment:(NSString *)alignment inFrame:(CGRect)frame;

Expand Down
2 changes: 2 additions & 0 deletions ios/RNNReactTitleView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -37,10 +37,12 @@ - (void)setRootViewDidChangeIntrinsicSize:(void (^)(CGSize))rootViewDidChangeInt
self.delegate = self;
}

#ifndef RCT_NEW_ARCH_ENABLED
- (void)rootViewDidChangeIntrinsicSize:(RCTRootView *)rootView {
if (_rootViewDidChangeIntrinsicSize) {
_rootViewDidChangeIntrinsicSize(rootView.intrinsicContentSize);
}
}
#endif

@end
2 changes: 2 additions & 0 deletions ios/RNNReactView.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@

#import "RNNEventEmitter.h"
#import "UIView+Utils.h"
#ifndef RCT_NEW_ARCH_ENABLED
#import <React/RCTRootViewDelegate.h>
#endif
#import <React/RCTUIManager.h>

#define ComponentTypeScreen @"Component"
Expand Down
1 change: 0 additions & 1 deletion ios/RNNReactView.mm
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#import "RNNReactView.h"
#import "RNNAppDelegate.h"
#import <React/RCTRootContentView.h>

#ifdef RCT_NEW_ARCH_ENABLED
#import <React-RuntimeApple/ReactCommon/RCTHost.h>
Expand Down
Loading