From 0cb20ede09f66de5f627a92018cd267d5ede76d5 Mon Sep 17 00:00:00 2001 From: yogevbd Date: Sun, 24 Dec 2017 18:26:26 +0200 Subject: [PATCH 1/2] async commands for all events --- lib/ios/RNNBridgeModule.m | 50 ++++++++++++++++++----------- lib/ios/RNNCommandsHandler.h | 14 ++++---- lib/ios/RNNCommandsHandler.m | 42 ++++++++++++++++++------ lib/ios/RNNModalManager.m | 3 +- lib/ios/RNNNavigationStackManager.m | 2 +- lib/ios/RNNStore.h | 2 +- 6 files changed, 76 insertions(+), 37 deletions(-) diff --git a/lib/ios/RNNBridgeModule.m b/lib/ios/RNNBridgeModule.m index 65cd11e0729..bda12dc0493 100644 --- a/lib/ios/RNNBridgeModule.m +++ b/lib/ios/RNNBridgeModule.m @@ -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 diff --git a/lib/ios/RNNCommandsHandler.h b/lib/ios/RNNCommandsHandler.h index 25013402bad..e7b0069bb56 100644 --- a/lib/ios/RNNCommandsHandler.h +++ b/lib/ios/RNNCommandsHandler.h @@ -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 diff --git a/lib/ios/RNNCommandsHandler.m b/lib/ios/RNNCommandsHandler.m index 99d0651c9f5..891d1676f41 100644 --- a/lib/ios/RNNCommandsHandler.m +++ b/lib/ios/RNNCommandsHandler.m @@ -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]; } } @@ -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"]) { @@ -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 { @@ -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 diff --git a/lib/ios/RNNModalManager.m b/lib/ios/RNNModalManager.m index 9e6f3660805..4c2cacde2bd 100644 --- a/lib/ios/RNNModalManager.m +++ b/lib/ios/RNNModalManager.m @@ -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; } }]; } diff --git a/lib/ios/RNNNavigationStackManager.m b/lib/ios/RNNNavigationStackManager.m index 9cae0549587..8269ad26d12 100644 --- a/lib/ios/RNNNavigationStackManager.m +++ b/lib/ios/RNNNavigationStackManager.m @@ -48,7 +48,7 @@ -(void)pushAfterLoad:(NSDictionary*)notif { [CATransaction begin]; [CATransaction setCompletionBlock:^{ if (_completionBlock) { - _completionBlock(self.toVC.containerId); + _completionBlock(); _completionBlock = nil; } }]; diff --git a/lib/ios/RNNStore.h b/lib/ios/RNNStore.h index 910a8978137..33db2e249f8 100644 --- a/lib/ios/RNNStore.h +++ b/lib/ios/RNNStore.h @@ -3,7 +3,7 @@ #import #import "RNNRootViewController.h" -typedef void (^RNNTransitionCompletionBlock)(id result); +typedef void (^RNNTransitionCompletionBlock)(void); @interface RNNStore : NSObject From 04e58df74507c3bcded18fbe8238a3f48f48bfe3 Mon Sep 17 00:00:00 2001 From: yogevbd Date: Mon, 25 Dec 2017 11:06:06 +0200 Subject: [PATCH 2/2] test fix --- .../ReactNativeNavigationTests/RNNCommandsHandlerTest.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/ios/ReactNativeNavigationTests/RNNCommandsHandlerTest.m b/lib/ios/ReactNativeNavigationTests/RNNCommandsHandlerTest.m index 59ae3ac2b0d..95a07f5f5bf 100644 --- a/lib/ios/ReactNativeNavigationTests/RNNCommandsHandlerTest.m +++ b/lib/ios/ReactNativeNavigationTests/RNNCommandsHandlerTest.m @@ -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