Skip to content
Merged
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
50 changes: 32 additions & 18 deletions lib/ios/RNNBridgeModule.m
Original file line number Diff line number Diff line change
Expand Up @@ -18,44 +18,58 @@ -(instancetype)initWithCommandsHandler:(RNNCommandsHandler *)commandsHandler {

#pragma mark - JS interface

RCT_EXPORT_METHOD(setRoot:(NSDictionary*)layout) {
[_commandsHandler setRoot:layout];
RCT_EXPORT_METHOD(setRoot:(NSDictionary*)layout resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
[_commandsHandler setRoot:layout completion:^{
resolve(layout);
}];
}

RCT_EXPORT_METHOD(setOptions:(NSString*)containerId options:(NSDictionary*)options) {
[_commandsHandler setOptions:containerId options:options];
RCT_EXPORT_METHOD(setOptions:(NSString*)containerId options:(NSDictionary*)options resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
[_commandsHandler setOptions:containerId options:options completion:^{
resolve(containerId);
}];
}

RCT_EXPORT_METHOD(push:(NSString*)containerId layout:(NSDictionary*)layout resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
[_commandsHandler push:containerId layout:layout completion:^(id result) {
resolve(result);
[_commandsHandler push:containerId layout:layout completion:^{
resolve(containerId);
}];
}

RCT_EXPORT_METHOD(pop:(NSString*)containerId options:(NSDictionary*)options) {
[_commandsHandler pop:containerId options:(NSDictionary*)options];
RCT_EXPORT_METHOD(pop:(NSString*)containerId options:(NSDictionary*)options resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
[_commandsHandler pop:containerId options:(NSDictionary*)options completion:^{
resolve(containerId);
}];
}

RCT_EXPORT_METHOD(popTo:(NSString*)containerId) {
[_commandsHandler popTo:containerId];
RCT_EXPORT_METHOD(popTo:(NSString*)containerId resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
[_commandsHandler popTo:containerId completion:^{
resolve(containerId);
}];
}

RCT_EXPORT_METHOD(popToRoot:(NSString*)containerId) {
[_commandsHandler popToRoot:containerId];
RCT_EXPORT_METHOD(popToRoot:(NSString*)containerId resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
[_commandsHandler popToRoot:containerId completion:^{
resolve(containerId);
}];
}

RCT_EXPORT_METHOD(showModal:(NSDictionary*)layout resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
[_commandsHandler showModal:layout completion:^(id containerID) {
resolve(containerID);
[_commandsHandler showModal:layout completion:^{
resolve(nil);
}];
}

RCT_EXPORT_METHOD(dismissModal:(NSString*)containerId) {
[_commandsHandler dismissModal:containerId];
RCT_EXPORT_METHOD(dismissModal:(NSString*)containerId resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
[_commandsHandler dismissModal:containerId completion:^{
resolve(containerId);
}];
}

RCT_EXPORT_METHOD(dismissAllModals) {
[_commandsHandler dismissAllModals];
RCT_EXPORT_METHOD(dismissAllModals:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
[_commandsHandler dismissAllModalsWithCompletion:^{
resolve(nil);
}];
}

@end
Expand Down
14 changes: 7 additions & 7 deletions lib/ios/RNNCommandsHandler.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,22 +8,22 @@

-(instancetype) initWithStore:(RNNStore*)store controllerFactory:(RNNControllerFactory*)controllerFactory andBridge:(RCTBridge*)bridge;

-(void) setRoot:(NSDictionary*)layout;
-(void) setRoot:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion;

-(void) setOptions:(NSString*)containerId options:(NSDictionary*)options;
-(void) setOptions:(NSString*)containerId options:(NSDictionary*)options completion:(RNNTransitionCompletionBlock)completion;

-(void) push:(NSString*)containerId layout:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion;

-(void) pop:(NSString*)containerId options:(NSDictionary*)options;
-(void) pop:(NSString*)containerId options:(NSDictionary*)options completion:(RNNTransitionCompletionBlock)completion;

-(void) popTo:(NSString*)containerId;
-(void) popTo:(NSString*)containerId completion:(RNNTransitionCompletionBlock)completion;

-(void) popToRoot:(NSString*)containerId;
-(void) popToRoot:(NSString*)containerId completion:(RNNTransitionCompletionBlock)completion;

-(void) showModal:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion;

-(void) dismissModal:(NSString*)containerId;
-(void) dismissModal:(NSString*)containerId completion:(RNNTransitionCompletionBlock)completion;

-(void) dismissAllModals;
-(void) dismissAllModalsWithCompletion:(RNNTransitionCompletionBlock)completion;

@end
42 changes: 33 additions & 9 deletions lib/ios/RNNCommandsHandler.m
Original file line number Diff line number Diff line change
Expand Up @@ -25,26 +25,32 @@ -(instancetype) initWithStore:(RNNStore*)store controllerFactory:(RNNControllerF

#pragma mark - public

-(void) setRoot:(NSDictionary*)layout {
-(void) setRoot:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion {
[self assertReady];

[_modalManager dismissAllModals];

UIViewController *vc = [_controllerFactory createLayoutAndSaveToStore:layout];

UIApplication.sharedApplication.delegate.window.rootViewController = vc;
[UIApplication.sharedApplication.delegate.window makeKeyAndVisible];
completion();
}

-(void) setOptions:(NSString*)containerId options:(NSDictionary*)options {
-(void) setOptions:(NSString*)containerId options:(NSDictionary*)options completion:(RNNTransitionCompletionBlock)completion {
[self assertReady];

UIViewController* vc = [_store findContainerForId:containerId];
if([vc isKindOfClass:[RNNRootViewController class]]) {
RNNRootViewController* rootVc = (RNNRootViewController*)vc;
[rootVc.navigationOptions mergeWith:options];
[CATransaction begin];
[CATransaction setCompletionBlock:completion];

[rootVc.navigationOptions applyOn:vc];
[rootVc applyNavigationButtons];

[CATransaction commit];
}
}

Expand All @@ -56,8 +62,10 @@ -(void) push:(NSString*)containerId layout:(NSDictionary*)layout completion:(RNN
[_navigationStackManager push:newVc onTop:containerId completion:completion];
}

-(void)pop:(NSString*)containerId options:(NSDictionary*)options{
-(void)pop:(NSString*)containerId options:(NSDictionary*)options completion:(RNNTransitionCompletionBlock)completion {
[self assertReady];
[CATransaction begin];
[CATransaction setCompletionBlock:completion];
NSDictionary* animationData = options[@"customTransition"];
if (animationData){
if ([animationData objectForKey:@"animations"]) {
Expand All @@ -68,19 +76,27 @@ -(void)pop:(NSString*)containerId options:(NSDictionary*)options{
} else {
[_navigationStackManager pop:containerId withAnimationData:nil];
}

[CATransaction commit];
}

-(void) popTo:(NSString*)containerId {
-(void) popTo:(NSString*)containerId completion:(RNNTransitionCompletionBlock)completion {
[self assertReady];
[CATransaction begin];
[CATransaction setCompletionBlock:completion];

[_navigationStackManager popTo:containerId];

[CATransaction commit];
}

-(void) popToRoot:(NSString*)containerId {
-(void) popToRoot:(NSString*)containerId completion:(RNNTransitionCompletionBlock)completion {
[self assertReady];
[CATransaction begin];
[CATransaction setCompletionBlock:completion];

[_navigationStackManager popToRoot:containerId];

[CATransaction commit];
}

-(void) showModal:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion {
Expand All @@ -90,16 +106,24 @@ -(void) showModal:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock
[_modalManager showModal:newVc completion:completion];
}

-(void) dismissModal:(NSString*)containerId {
-(void) dismissModal:(NSString*)containerId completion:(RNNTransitionCompletionBlock)completion {
[self assertReady];
[CATransaction begin];
[CATransaction setCompletionBlock:completion];

[_modalManager dismissModal:containerId];

[CATransaction commit];
}

-(void) dismissAllModals {
-(void) dismissAllModalsWithCompletion:(RNNTransitionCompletionBlock)completion {
[self assertReady];
[CATransaction begin];
[CATransaction setCompletionBlock:completion];

[_modalManager dismissAllModals];

[CATransaction commit];
}

#pragma mark - private
Expand Down
3 changes: 2 additions & 1 deletion lib/ios/RNNModalManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ -(void)showModalAfterLoad:(NSDictionary*)notif {
UIViewController *topVC = [self topPresentedVC];
[topVC presentViewController:self.toVC animated:YES completion:^{
if (_completionBlock) {
_completionBlock([_store containerKeyForInstance:self.toVC]);
_completionBlock();
_completionBlock = nil;
}
}];
}
Expand Down
2 changes: 1 addition & 1 deletion lib/ios/RNNNavigationStackManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ -(void)pushAfterLoad:(NSDictionary*)notif {
[CATransaction begin];
[CATransaction setCompletionBlock:^{
if (_completionBlock) {
_completionBlock(self.toVC.containerId);
_completionBlock();
_completionBlock = nil;
}
}];
Expand Down
2 changes: 1 addition & 1 deletion lib/ios/RNNStore.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
#import <UIKit/UIKit.h>
#import "RNNRootViewController.h"

typedef void (^RNNTransitionCompletionBlock)(id result);
typedef void (^RNNTransitionCompletionBlock)(void);

@interface RNNStore : NSObject

Expand Down
8 changes: 4 additions & 4 deletions lib/ios/ReactNativeNavigationTests/RNNCommandsHandlerTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -82,10 +82,10 @@ -(void)testDynamicStylesMergeWithStaticStyles {
NSDictionary* dictFromJs = @{@"topBar": @{@"backgroundColor" :@(0xFFFF0000)}};
UIColor* expectedColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1];

[self.uut setOptions:@"containerId" options:dictFromJs];

XCTAssertTrue([vc.navigationItem.title isEqual:@"the title"]);
XCTAssertTrue([nav.navigationBar.barTintColor isEqual:expectedColor]);
[self.uut setOptions:@"containerId" options:dictFromJs completion:^{
XCTAssertTrue([vc.navigationItem.title isEqual:@"the title"]);
XCTAssertTrue([nav.navigationBar.barTintColor isEqual:expectedColor]);
}];
}

@end