ソースを参照

V2 async commands (#2407)

* async commands for all events

* test fix
yogevbd 6 年 前
コミット
7450ac45e2

+ 32
- 18
lib/ios/RNNBridgeModule.m ファイルの表示

@@ -18,44 +18,58 @@ RCT_EXPORT_MODULE();
18 18
 
19 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 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 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 75
 @end

+ 7
- 7
lib/ios/RNNCommandsHandler.h ファイルの表示

@@ -8,22 +8,22 @@
8 8
 
9 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 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 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 29
 @end

+ 33
- 9
lib/ios/RNNCommandsHandler.m ファイルの表示

@@ -25,26 +25,32 @@
25 25
 
26 26
 #pragma mark - public
27 27
 
28
--(void) setRoot:(NSDictionary*)layout {
28
+-(void) setRoot:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion {
29 29
 	[self assertReady];
30
-
30
+	
31 31
 	[_modalManager dismissAllModals];
32 32
 	
33 33
 	UIViewController *vc = [_controllerFactory createLayoutAndSaveToStore:layout];
34 34
 	
35 35
 	UIApplication.sharedApplication.delegate.window.rootViewController = vc;
36 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 41
 	[self assertReady];
41 42
 	
42 43
 	UIViewController* vc = [_store findContainerForId:containerId];
43 44
 	if([vc isKindOfClass:[RNNRootViewController class]]) {
44 45
 		RNNRootViewController* rootVc = (RNNRootViewController*)vc;
45 46
 		[rootVc.navigationOptions mergeWith:options];
47
+		[CATransaction begin];
48
+		[CATransaction setCompletionBlock:completion];
49
+		
46 50
 		[rootVc.navigationOptions applyOn:vc];
47 51
 		[rootVc applyNavigationButtons];
52
+		
53
+		[CATransaction commit];
48 54
 	}
49 55
 }
50 56
 
@@ -56,8 +62,10 @@
56 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 66
 	[self assertReady];
67
+	[CATransaction begin];
68
+	[CATransaction setCompletionBlock:completion];
61 69
 	NSDictionary* animationData = options[@"customTransition"];
62 70
 	if (animationData){
63 71
 		if ([animationData objectForKey:@"animations"]) {
@@ -68,19 +76,27 @@
68 76
 	} else {
69 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 83
 	[self assertReady];
84
+	[CATransaction begin];
85
+	[CATransaction setCompletionBlock:completion];
76 86
 	
77 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 93
 	[self assertReady];
94
+	[CATransaction begin];
95
+	[CATransaction setCompletionBlock:completion];
82 96
 	
83 97
 	[_navigationStackManager popToRoot:containerId];
98
+	
99
+	[CATransaction commit];
84 100
 }
85 101
 
86 102
 -(void) showModal:(NSDictionary*)layout completion:(RNNTransitionCompletionBlock)completion {
@@ -90,16 +106,24 @@
90 106
 	[_modalManager showModal:newVc completion:completion];
91 107
 }
92 108
 
93
--(void) dismissModal:(NSString*)containerId {
109
+-(void) dismissModal:(NSString*)containerId completion:(RNNTransitionCompletionBlock)completion {
94 110
 	[self assertReady];
111
+	[CATransaction begin];
112
+	[CATransaction setCompletionBlock:completion];
95 113
 	
96 114
 	[_modalManager dismissModal:containerId];
115
+	
116
+	[CATransaction commit];
97 117
 }
98 118
 
99
--(void) dismissAllModals {
119
+-(void) dismissAllModalsWithCompletion:(RNNTransitionCompletionBlock)completion {
100 120
 	[self assertReady];
121
+	[CATransaction begin];
122
+	[CATransaction setCompletionBlock:completion];
101 123
 	
102 124
 	[_modalManager dismissAllModals];
125
+	
126
+	[CATransaction commit];
103 127
 }
104 128
 
105 129
 #pragma mark - private

+ 2
- 1
lib/ios/RNNModalManager.m ファイルの表示

@@ -24,7 +24,8 @@
24 24
 	UIViewController *topVC = [self topPresentedVC];
25 25
 	[topVC presentViewController:self.toVC animated:YES completion:^{
26 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 ファイルの表示

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

+ 1
- 1
lib/ios/RNNStore.h ファイルの表示

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

+ 4
- 4
lib/ios/ReactNativeNavigationTests/RNNCommandsHandlerTest.m ファイルの表示

@@ -82,10 +82,10 @@
82 82
 	NSDictionary* dictFromJs = @{@"topBar": @{@"backgroundColor" :@(0xFFFF0000)}};
83 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 91
 @end