Browse Source

V2 async commands (#2407)

* async commands for all events

* test fix
yogevbd 6 years ago
parent
commit
7450ac45e2

+ 32
- 18
lib/ios/RNNBridgeModule.m View File

18
 
18
 
19
 #pragma mark - JS interface
19
 #pragma mark - JS interface
20
 
20
 
21
-RCT_EXPORT_METHOD(setRoot:(NSDictionary*)layout) {
22
-	[_commandsHandler setRoot:layout];
21
+RCT_EXPORT_METHOD(setRoot:(NSDictionary*)layout resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
22
+	[_commandsHandler setRoot:layout completion:^{
23
+		resolve(layout);
24
+	}];
23
 }
25
 }
24
 
26
 
25
-RCT_EXPORT_METHOD(setOptions:(NSString*)containerId options:(NSDictionary*)options) {
26
-	[_commandsHandler setOptions:containerId options:options];
27
+RCT_EXPORT_METHOD(setOptions:(NSString*)containerId options:(NSDictionary*)options resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
28
+	[_commandsHandler setOptions:containerId options:options completion:^{
29
+		resolve(containerId);
30
+	}];
27
 }
31
 }
28
 
32
 
29
 RCT_EXPORT_METHOD(push:(NSString*)containerId layout:(NSDictionary*)layout resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
33
 RCT_EXPORT_METHOD(push:(NSString*)containerId layout:(NSDictionary*)layout resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
30
-	[_commandsHandler push:containerId layout:layout completion:^(id result) {
31
-		resolve(result);
34
+	[_commandsHandler push:containerId layout:layout completion:^{
35
+		resolve(containerId);
32
 	}];
36
 	}];
33
 }
37
 }
34
 
38
 
35
-RCT_EXPORT_METHOD(pop:(NSString*)containerId options:(NSDictionary*)options) {
36
-	[_commandsHandler pop:containerId options:(NSDictionary*)options];
39
+RCT_EXPORT_METHOD(pop:(NSString*)containerId options:(NSDictionary*)options resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
40
+	[_commandsHandler pop:containerId options:(NSDictionary*)options completion:^{
41
+		resolve(containerId);
42
+	}];
37
 }
43
 }
38
 
44
 
39
-RCT_EXPORT_METHOD(popTo:(NSString*)containerId) {
40
-	[_commandsHandler popTo:containerId];
45
+RCT_EXPORT_METHOD(popTo:(NSString*)containerId resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
46
+	[_commandsHandler popTo:containerId completion:^{
47
+		resolve(containerId);
48
+	}];
41
 }
49
 }
42
 
50
 
43
-RCT_EXPORT_METHOD(popToRoot:(NSString*)containerId) {
44
-	[_commandsHandler popToRoot:containerId];
51
+RCT_EXPORT_METHOD(popToRoot:(NSString*)containerId resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
52
+	[_commandsHandler popToRoot:containerId completion:^{
53
+		resolve(containerId);
54
+	}];
45
 }
55
 }
46
 
56
 
47
 RCT_EXPORT_METHOD(showModal:(NSDictionary*)layout resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
57
 RCT_EXPORT_METHOD(showModal:(NSDictionary*)layout resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
48
-	[_commandsHandler showModal:layout completion:^(id containerID) {
49
-		resolve(containerID);
58
+	[_commandsHandler showModal:layout completion:^{
59
+		resolve(nil);
50
 	}];
60
 	}];
51
 }
61
 }
52
 
62
 
53
-RCT_EXPORT_METHOD(dismissModal:(NSString*)containerId) {
54
-	[_commandsHandler dismissModal:containerId];
63
+RCT_EXPORT_METHOD(dismissModal:(NSString*)containerId resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
64
+	[_commandsHandler dismissModal:containerId completion:^{
65
+		resolve(containerId);
66
+	}];
55
 }
67
 }
56
 
68
 
57
-RCT_EXPORT_METHOD(dismissAllModals) {
58
-	[_commandsHandler dismissAllModals];
69
+RCT_EXPORT_METHOD(dismissAllModals:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
70
+	[_commandsHandler dismissAllModalsWithCompletion:^{
71
+		resolve(nil);
72
+	}];
59
 }
73
 }
60
 
74
 
61
 @end
75
 @end

+ 7
- 7
lib/ios/RNNCommandsHandler.h View File

8
 
8
 
9
 -(instancetype) initWithStore:(RNNStore*)store controllerFactory:(RNNControllerFactory*)controllerFactory andBridge:(RCTBridge*)bridge;
9
 -(instancetype) initWithStore:(RNNStore*)store controllerFactory:(RNNControllerFactory*)controllerFactory andBridge:(RCTBridge*)bridge;
10
 
10
 
11
--(void) setRoot:(NSDictionary*)layout;
11
+-(void) setRoot:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion;
12
 
12
 
13
--(void) setOptions:(NSString*)containerId options:(NSDictionary*)options;
13
+-(void) setOptions:(NSString*)containerId options:(NSDictionary*)options completion:(RNNTransitionCompletionBlock)completion;
14
 
14
 
15
 -(void) push:(NSString*)containerId layout:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion;
15
 -(void) push:(NSString*)containerId layout:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion;
16
 
16
 
17
--(void) pop:(NSString*)containerId options:(NSDictionary*)options;
17
+-(void) pop:(NSString*)containerId options:(NSDictionary*)options completion:(RNNTransitionCompletionBlock)completion;
18
 
18
 
19
--(void) popTo:(NSString*)containerId;
19
+-(void) popTo:(NSString*)containerId completion:(RNNTransitionCompletionBlock)completion;
20
 
20
 
21
--(void) popToRoot:(NSString*)containerId;
21
+-(void) popToRoot:(NSString*)containerId completion:(RNNTransitionCompletionBlock)completion;
22
 
22
 
23
 -(void) showModal:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion;
23
 -(void) showModal:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion;
24
 
24
 
25
--(void) dismissModal:(NSString*)containerId;
25
+-(void) dismissModal:(NSString*)containerId completion:(RNNTransitionCompletionBlock)completion;
26
 
26
 
27
--(void) dismissAllModals;
27
+-(void) dismissAllModalsWithCompletion:(RNNTransitionCompletionBlock)completion;
28
 
28
 
29
 @end
29
 @end

+ 33
- 9
lib/ios/RNNCommandsHandler.m View File

25
 
25
 
26
 #pragma mark - public
26
 #pragma mark - public
27
 
27
 
28
--(void) setRoot:(NSDictionary*)layout {
28
+-(void) setRoot:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion {
29
 	[self assertReady];
29
 	[self assertReady];
30
-
30
+	
31
 	[_modalManager dismissAllModals];
31
 	[_modalManager dismissAllModals];
32
 	
32
 	
33
 	UIViewController *vc = [_controllerFactory createLayoutAndSaveToStore:layout];
33
 	UIViewController *vc = [_controllerFactory createLayoutAndSaveToStore:layout];
34
 	
34
 	
35
 	UIApplication.sharedApplication.delegate.window.rootViewController = vc;
35
 	UIApplication.sharedApplication.delegate.window.rootViewController = vc;
36
 	[UIApplication.sharedApplication.delegate.window makeKeyAndVisible];
36
 	[UIApplication.sharedApplication.delegate.window makeKeyAndVisible];
37
+	completion();
37
 }
38
 }
38
 
39
 
39
--(void) setOptions:(NSString*)containerId options:(NSDictionary*)options {
40
+-(void) setOptions:(NSString*)containerId options:(NSDictionary*)options completion:(RNNTransitionCompletionBlock)completion {
40
 	[self assertReady];
41
 	[self assertReady];
41
 	
42
 	
42
 	UIViewController* vc = [_store findContainerForId:containerId];
43
 	UIViewController* vc = [_store findContainerForId:containerId];
43
 	if([vc isKindOfClass:[RNNRootViewController class]]) {
44
 	if([vc isKindOfClass:[RNNRootViewController class]]) {
44
 		RNNRootViewController* rootVc = (RNNRootViewController*)vc;
45
 		RNNRootViewController* rootVc = (RNNRootViewController*)vc;
45
 		[rootVc.navigationOptions mergeWith:options];
46
 		[rootVc.navigationOptions mergeWith:options];
47
+		[CATransaction begin];
48
+		[CATransaction setCompletionBlock:completion];
49
+		
46
 		[rootVc.navigationOptions applyOn:vc];
50
 		[rootVc.navigationOptions applyOn:vc];
47
 		[rootVc applyNavigationButtons];
51
 		[rootVc applyNavigationButtons];
52
+		
53
+		[CATransaction commit];
48
 	}
54
 	}
49
 }
55
 }
50
 
56
 
56
 	[_navigationStackManager push:newVc onTop:containerId completion:completion];
62
 	[_navigationStackManager push:newVc onTop:containerId completion:completion];
57
 }
63
 }
58
 
64
 
59
--(void)pop:(NSString*)containerId options:(NSDictionary*)options{
65
+-(void)pop:(NSString*)containerId options:(NSDictionary*)options completion:(RNNTransitionCompletionBlock)completion {
60
 	[self assertReady];
66
 	[self assertReady];
67
+	[CATransaction begin];
68
+	[CATransaction setCompletionBlock:completion];
61
 	NSDictionary* animationData = options[@"customTransition"];
69
 	NSDictionary* animationData = options[@"customTransition"];
62
 	if (animationData){
70
 	if (animationData){
63
 		if ([animationData objectForKey:@"animations"]) {
71
 		if ([animationData objectForKey:@"animations"]) {
68
 	} else {
76
 	} else {
69
 		[_navigationStackManager pop:containerId withAnimationData:nil];
77
 		[_navigationStackManager pop:containerId withAnimationData:nil];
70
 	}
78
 	}
71
-	
79
+	[CATransaction commit];
72
 }
80
 }
73
 
81
 
74
--(void) popTo:(NSString*)containerId {
82
+-(void) popTo:(NSString*)containerId completion:(RNNTransitionCompletionBlock)completion {
75
 	[self assertReady];
83
 	[self assertReady];
84
+	[CATransaction begin];
85
+	[CATransaction setCompletionBlock:completion];
76
 	
86
 	
77
 	[_navigationStackManager popTo:containerId];
87
 	[_navigationStackManager popTo:containerId];
88
+	
89
+	[CATransaction commit];
78
 }
90
 }
79
 
91
 
80
--(void) popToRoot:(NSString*)containerId {
92
+-(void) popToRoot:(NSString*)containerId completion:(RNNTransitionCompletionBlock)completion {
81
 	[self assertReady];
93
 	[self assertReady];
94
+	[CATransaction begin];
95
+	[CATransaction setCompletionBlock:completion];
82
 	
96
 	
83
 	[_navigationStackManager popToRoot:containerId];
97
 	[_navigationStackManager popToRoot:containerId];
98
+	
99
+	[CATransaction commit];
84
 }
100
 }
85
 
101
 
86
 -(void) showModal:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion {
102
 -(void) showModal:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion {
90
 	[_modalManager showModal:newVc completion:completion];
106
 	[_modalManager showModal:newVc completion:completion];
91
 }
107
 }
92
 
108
 
93
--(void) dismissModal:(NSString*)containerId {
109
+-(void) dismissModal:(NSString*)containerId completion:(RNNTransitionCompletionBlock)completion {
94
 	[self assertReady];
110
 	[self assertReady];
111
+	[CATransaction begin];
112
+	[CATransaction setCompletionBlock:completion];
95
 	
113
 	
96
 	[_modalManager dismissModal:containerId];
114
 	[_modalManager dismissModal:containerId];
115
+	
116
+	[CATransaction commit];
97
 }
117
 }
98
 
118
 
99
--(void) dismissAllModals {
119
+-(void) dismissAllModalsWithCompletion:(RNNTransitionCompletionBlock)completion {
100
 	[self assertReady];
120
 	[self assertReady];
121
+	[CATransaction begin];
122
+	[CATransaction setCompletionBlock:completion];
101
 	
123
 	
102
 	[_modalManager dismissAllModals];
124
 	[_modalManager dismissAllModals];
125
+	
126
+	[CATransaction commit];
103
 }
127
 }
104
 
128
 
105
 #pragma mark - private
129
 #pragma mark - private

+ 2
- 1
lib/ios/RNNModalManager.m View File

24
 	UIViewController *topVC = [self topPresentedVC];
24
 	UIViewController *topVC = [self topPresentedVC];
25
 	[topVC presentViewController:self.toVC animated:YES completion:^{
25
 	[topVC presentViewController:self.toVC animated:YES completion:^{
26
 		if (_completionBlock) {
26
 		if (_completionBlock) {
27
-			_completionBlock([_store containerKeyForInstance:self.toVC]);
27
+			_completionBlock();
28
+			_completionBlock = nil;
28
 		}
29
 		}
29
 	}];
30
 	}];
30
 }
31
 }

+ 1
- 1
lib/ios/RNNNavigationStackManager.m View File

48
 	[CATransaction begin];
48
 	[CATransaction begin];
49
 	[CATransaction setCompletionBlock:^{
49
 	[CATransaction setCompletionBlock:^{
50
 		if (_completionBlock) {
50
 		if (_completionBlock) {
51
-			_completionBlock(self.toVC.containerId);
51
+			_completionBlock();
52
 			_completionBlock = nil;
52
 			_completionBlock = nil;
53
 		}
53
 		}
54
 	}];
54
 	}];

+ 1
- 1
lib/ios/RNNStore.h View File

3
 #import <UIKit/UIKit.h>
3
 #import <UIKit/UIKit.h>
4
 #import "RNNRootViewController.h"
4
 #import "RNNRootViewController.h"
5
 
5
 
6
-typedef void (^RNNTransitionCompletionBlock)(id result);
6
+typedef void (^RNNTransitionCompletionBlock)(void);
7
 
7
 
8
 @interface RNNStore : NSObject
8
 @interface RNNStore : NSObject
9
 
9
 

+ 4
- 4
lib/ios/ReactNativeNavigationTests/RNNCommandsHandlerTest.m View File

82
 	NSDictionary* dictFromJs = @{@"topBar": @{@"backgroundColor" :@(0xFFFF0000)}};
82
 	NSDictionary* dictFromJs = @{@"topBar": @{@"backgroundColor" :@(0xFFFF0000)}};
83
 	UIColor* expectedColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1];
83
 	UIColor* expectedColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:1];
84
 
84
 
85
-	[self.uut setOptions:@"containerId" options:dictFromJs];
86
-
87
-	XCTAssertTrue([vc.navigationItem.title isEqual:@"the title"]);
88
-	XCTAssertTrue([nav.navigationBar.barTintColor isEqual:expectedColor]);
85
+	[self.uut setOptions:@"containerId" options:dictFromJs completion:^{
86
+		XCTAssertTrue([vc.navigationItem.title isEqual:@"the title"]);
87
+		XCTAssertTrue([nav.navigationBar.barTintColor isEqual:expectedColor]);
88
+	}];
89
 }
89
 }
90
 
90
 
91
 @end
91
 @end