Skip to content
Open
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
1 change: 0 additions & 1 deletion ios/RNNReactButtonView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ - (instancetype)initWithHost:(RCTHost *)host
sizeMeasureMode:(RCTSurfaceSizeMeasureMode)sizeMeasureMode
reactViewReadyBlock:(RNNReactViewReadyCompletionBlock)reactViewReadyBlock {
self = [super initWithHost:host moduleName:moduleName initialProperties:initialProperties eventEmitter:eventEmitter sizeMeasureMode:convertToSurfaceSizeMeasureMode(RCTRootViewSizeFlexibilityWidthAndHeight) reactViewReadyBlock:reactViewReadyBlock];
[host.surfacePresenter addObserver:self];
self.backgroundColor = [UIColor clearColor];

if (@available(iOS 26.0, *)) {
Expand Down
42 changes: 30 additions & 12 deletions ios/RNNReactView.mm
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ @implementation RNNReactView {
BOOL _pendingDidAppear;
BOOL _didAppear;
BOOL _willAppear;
#ifdef RCT_NEW_ARCH_ENABLED
__weak RCTSurfacePresenter *_surfacePresenter;
#endif
}

#ifdef RCT_NEW_ARCH_ENABLED
Expand All @@ -38,17 +41,23 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge
self = [super initWithBridge:bridge moduleName:moduleName initialProperties:initialProperties];
#endif

_reactViewReadyBlock = reactViewReadyBlock;
_eventEmitter = eventEmitter;
if (self) {
#ifdef RCT_NEW_ARCH_ENABLED
_surfacePresenter = (RCTSurfacePresenter *)bridge.surfacePresenter;
[_surfacePresenter addObserver:self];
#endif
_reactViewReadyBlock = reactViewReadyBlock;
_eventEmitter = eventEmitter;

#ifdef RCT_NEW_ARCH_ENABLED
[surface start];
[surface start];
#else
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(contentDidAppear:)
name:RCTContentDidAppearNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(contentDidAppear:)
name:RCTContentDidAppearNotification
object:nil];
#endif
}

return self;
}
Expand All @@ -63,16 +72,25 @@ - (instancetype)initWithHost:(RCTHost *)host

RCTFabricSurface *surface = [host createSurfaceWithModuleName:moduleName
initialProperties:initialProperties];
[host.surfacePresenter addObserver:self];
self = [super initWithSurface:surface sizeMeasureMode:sizeMeasureMode];

_reactViewReadyBlock = reactViewReadyBlock;
_eventEmitter = eventEmitter;

if (self) {
_surfacePresenter = host.surfacePresenter;
[_surfacePresenter addObserver:self];

_reactViewReadyBlock = reactViewReadyBlock;
_eventEmitter = eventEmitter;
}

return self;
}
#endif

- (void)dealloc {
#ifdef RCT_NEW_ARCH_ENABLED
[_surfacePresenter removeObserver:self];
#endif
}

#ifdef RCT_NEW_ARCH_ENABLED
#pragma mark - RCTSurfaceDelegate
- (void)surface:(__unused RCTSurface *)surface didChangeStage:(RCTSurfaceStage)stage {
Expand Down
54 changes: 54 additions & 0 deletions playground/ios/NavigationTests/RNNReactButtonViewTest.mm
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#import <OCMock/OCMock.h>
#import <ReactNativeNavigation/RNNReactButtonView.h>
#import <XCTest/XCTest.h>

#ifdef RCT_NEW_ARCH_ENABLED
#import <React-RuntimeApple/ReactCommon/RCTHost.h>
#import <React/RCTFabricSurface.h>
#import <React/RCTSurfacePresenter.h>

@interface RNNSurfacePresenterSpy : NSObject
@property(nonatomic) NSInteger addCount;
@end

@implementation RNNSurfacePresenterSpy

- (void)addObserver:(__unused id<RCTSurfacePresenterObserver>)observer {
self.addCount += 1;
}

- (void)removeObserver:(__unused id<RCTSurfacePresenterObserver>)observer {
}

@end
#endif

@interface RNNReactButtonViewTest : XCTestCase
@end

@implementation RNNReactButtonViewTest

#ifdef RCT_NEW_ARCH_ENABLED
- (void)testRegistersSurfacePresenterObserverOnce {
id host = OCMClassMock([RCTHost class]);
id surface = OCMClassMock([RCTFabricSurface class]);
RNNSurfacePresenterSpy *surfacePresenter = [RNNSurfacePresenterSpy new];
OCMStub([host createSurfaceWithModuleName:@"Button" initialProperties:@{}]).andReturn(surface);
OCMStub([host surfacePresenter]).andReturn(surfacePresenter);

RNNReactButtonView *view = [[RNNReactButtonView alloc]
initWithHost:host
moduleName:@"Button"
initialProperties:@{}
eventEmitter:nil
sizeMeasureMode:RCTSurfaceSizeMeasureModeWidthUndefined |
RCTSurfaceSizeMeasureModeHeightUndefined
reactViewReadyBlock:nil];

XCTAssertNotNil(view);
XCTAssertEqual(surfacePresenter.addCount, 1);
}

#endif

@end
4 changes: 4 additions & 0 deletions playground/ios/playground.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
50996C6923AA487800008F89 /* RNNTestRootViewCreator.mm in Sources */ = {isa = PBXBuildFile; fileRef = E58D263D2385888C003F36BA /* RNNTestRootViewCreator.mm */; };
50BCB27623F1A2B100D6C8E5 /* TopBarAppearancePresenterTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 50BCB27523F1A26600D6C8E5 /* TopBarAppearancePresenterTest.mm */; };
50C085E62591341600B0502C /* RNNUIBarButtonItemTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 50C085E52591341600B0502C /* RNNUIBarButtonItemTest.mm */; };
C6FFE0D95634444585A67D66 /* RNNReactButtonViewTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B9ECE2F1FB6445390982D7F /* RNNReactButtonViewTest.mm */; };
50C085E8259141E200B0502C /* RNNButtonsPresenterTest.mm in Sources */ = {isa = PBXBuildFile; fileRef = 50C085E7259141E200B0502C /* RNNButtonsPresenterTest.mm */; };
50C085F52594973000B0502C /* RNNComponentViewController+Utils.mm in Sources */ = {isa = PBXBuildFile; fileRef = 50C9A8D3240FB9D000BD699F /* RNNComponentViewController+Utils.mm */; };
50C9A8D1240EB95F00BD699F /* RNNBottomTabsController+Helpers.mm in Sources */ = {isa = PBXBuildFile; fileRef = 50CF233C240695B10098042D /* RNNBottomTabsController+Helpers.mm */; };
Expand Down Expand Up @@ -159,6 +160,7 @@
50996C6723AA477400008F89 /* RNNRootViewControllerTest.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RNNRootViewControllerTest.mm; sourceTree = "<group>"; };
50BCB27523F1A26600D6C8E5 /* TopBarAppearancePresenterTest.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = TopBarAppearancePresenterTest.mm; sourceTree = "<group>"; };
50C085E52591341600B0502C /* RNNUIBarButtonItemTest.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RNNUIBarButtonItemTest.mm; sourceTree = "<group>"; };
4B9ECE2F1FB6445390982D7F /* RNNReactButtonViewTest.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RNNReactButtonViewTest.mm; sourceTree = "<group>"; };
50C085E7259141E200B0502C /* RNNButtonsPresenterTest.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RNNButtonsPresenterTest.mm; sourceTree = "<group>"; };
50C9A8D2240FB9D000BD699F /* RNNComponentViewController+Utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "RNNComponentViewController+Utils.h"; sourceTree = "<group>"; };
50C9A8D3240FB9D000BD699F /* RNNComponentViewController+Utils.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "RNNComponentViewController+Utils.mm"; sourceTree = "<group>"; };
Expand Down Expand Up @@ -403,6 +405,7 @@
E58D26412385888C003F36BA /* RNNCommandsHandlerTest.mm */,
E58D26352385888B003F36BA /* RNNComponentPresenterTest.mm */,
50C085E52591341600B0502C /* RNNUIBarButtonItemTest.mm */,
4B9ECE2F1FB6445390982D7F /* RNNReactButtonViewTest.mm */,
50C085E7259141E200B0502C /* RNNButtonsPresenterTest.mm */,
E58D26402385888C003F36BA /* RNNViewControllerFactoryTest.mm */,
E58D26272385888B003F36BA /* RNNDotIndicatorPresenterTest.mm */,
Expand Down Expand Up @@ -985,6 +988,7 @@
E58D265E2385888C003F36BA /* RNNCommandsHandlerTest.mm in Sources */,
E58D264B2385888C003F36BA /* RNNLayoutManagerTest.mm in Sources */,
50C085E62591341600B0502C /* RNNUIBarButtonItemTest.mm in Sources */,
C6FFE0D95634444585A67D66 /* RNNReactButtonViewTest.mm in Sources */,
E58D26592385888C003F36BA /* RNNNavigationStackManagerTest.mm in Sources */,
E58D26602385888C003F36BA /* RNNModalManagerTest.mm in Sources */,
E58D26502385888C003F36BA /* RNNNavigationOptionsTest.mm in Sources */,
Expand Down