소스 검색

#830 dismissAllModals

Ran Greenberg 8 년 전
부모
커밋
b9af609e37

+ 6
- 0
ios/RNNBridgeModule.m 파일 보기

@@ -58,6 +58,12 @@ RCT_EXPORT_METHOD(dismissModal:(NSString*)containerId)
58 58
 	[[[RNNModalManager alloc] initWithStore:[RNN instance].store] dismissModal:containerId];
59 59
 }
60 60
 
61
+RCT_EXPORT_METHOD(dismissAllModals)
62
+{
63
+	[self assertReady];
64
+	[[[RNNModalManager alloc] initWithStore:[RNN instance].store] dismissAllModals];
65
+}
66
+
61 67
 
62 68
 
63 69
 - (void)assertReady

+ 1
- 0
ios/RNNModalManager.h 파일 보기

@@ -9,5 +9,6 @@
9 9
 
10 10
 -(void)showModal:(UIViewController*)viewController;
11 11
 -(void)dismissModal:(NSString*)containerId;
12
+-(void)dismissAllModals;
12 13
 
13 14
 @end

+ 8
- 0
ios/RNNModalManager.m 파일 보기

@@ -25,8 +25,16 @@
25 25
 	[self removePendingNextModalIfOnTop];
26 26
 }
27 27
 
28
+-(void)dismissAllModals {
29
+	UIViewController *root = UIApplication.sharedApplication.delegate.window.rootViewController;
30
+	[root dismissViewControllerAnimated:YES completion:nil];
31
+	[self.store.modalsToDismissArray removeAllObjects];
32
+}
33
+
34
+
28 35
 #pragma mark - private
29 36
 
37
+
30 38
 -(void)removePendingNextModalIfOnTop {
31 39
 	NSString *containerId = [self.store.modalsToDismissArray lastObject];
32 40
 	

+ 7
- 2
playground/e2e/app.test.js 파일 보기

@@ -115,8 +115,13 @@ describe('app', () => {
115 115
     expect(elementByLabel('React Native Navigation!')).toBeVisible();
116 116
   });
117 117
 
118
-  xit('dismissAllModals', () => {
119
-    //
118
+  it('dismissAllModals', () => {
119
+    elementByLabel('Show Modal').tap();
120
+    expect(elementByLabel('Modal Stack Position: 1')).toBeVisible();
121
+    elementByLabel('Show Modal').tap();
122
+    expect(elementByLabel('Modal Stack Position: 2')).toBeVisible();
123
+    elementByLabel('Dismiss All Modals').tap();
124
+    expect(elementByLabel('React Native Navigation!')).toBeVisible();
120 125
   });
121 126
 });
122 127
 

+ 4
- 0
playground/ios/playground.xcodeproj/project.pbxproj 파일 보기

@@ -21,6 +21,7 @@
21 21
 		13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
22 22
 		146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
23 23
 		26070FD01E4B8B9D003EC8B9 /* RNNControllerFactoryTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 26070FCF1E4B8B9D003EC8B9 /* RNNControllerFactoryTest.m */; };
24
+		261F0E671E6EE9EC00989DE2 /* RNNModalManagerTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 261F0E661E6EE9EC00989DE2 /* RNNModalManagerTest.m */; };
24 25
 		2647D65F1DB175C200B23722 /* libReactNativeNavigation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2647D65E1DB175B300B23722 /* libReactNativeNavigation.a */; };
25 26
 		268692851E50572700E2C612 /* RNNStoreTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 268692841E50572700E2C612 /* RNNStoreTest.m */; };
26 27
 		7B9B39861DEB4091004A6281 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B9B39631DEB4076004A6281 /* libRCTAnimation.a */; };
@@ -253,6 +254,7 @@
253 254
 		13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
254 255
 		146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; };
255 256
 		26070FCF1E4B8B9D003EC8B9 /* RNNControllerFactoryTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNNControllerFactoryTest.m; sourceTree = "<group>"; };
257
+		261F0E661E6EE9EC00989DE2 /* RNNModalManagerTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNNModalManagerTest.m; sourceTree = "<group>"; };
256 258
 		2647D6591DB175B300B23722 /* ReactNativeNavigation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ReactNativeNavigation.xcodeproj; path = "../node_modules/react-native-navigation/ios/ReactNativeNavigation.xcodeproj"; sourceTree = "<group>"; };
257 259
 		268692841E50572700E2C612 /* RNNStoreTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNNStoreTest.m; sourceTree = "<group>"; };
258 260
 		78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
@@ -338,6 +340,7 @@
338 340
 			children = (
339 341
 				26070FCF1E4B8B9D003EC8B9 /* RNNControllerFactoryTest.m */,
340 342
 				268692841E50572700E2C612 /* RNNStoreTest.m */,
343
+				261F0E661E6EE9EC00989DE2 /* RNNModalManagerTest.m */,
341 344
 				00E356F01AD99517003FC87E /* Supporting Files */,
342 345
 			);
343 346
 			path = playgroundTests;
@@ -829,6 +832,7 @@
829 832
 			buildActionMask = 2147483647;
830 833
 			files = (
831 834
 				268692851E50572700E2C612 /* RNNStoreTest.m in Sources */,
835
+				261F0E671E6EE9EC00989DE2 /* RNNModalManagerTest.m in Sources */,
832 836
 				26070FD01E4B8B9D003EC8B9 /* RNNControllerFactoryTest.m in Sources */,
833 837
 			);
834 838
 			runOnlyForDeploymentPostprocessing = 0;

+ 23
- 0
playground/ios/playgroundTests/RNNModalManagerTest.m 파일 보기

@@ -0,0 +1,23 @@
1
+#import <XCTest/XCTest.h>
2
+#import "RNNModalManager.m"
3
+
4
+@interface RNNModalManagerTest : XCTestCase
5
+
6
+@end
7
+
8
+@implementation RNNModalManagerTest
9
+
10
+- (void)testDismissAllModalsCleansPendingModalsToDismiss {
11
+	RNNStore *store = [RNNStore new];
12
+	[store.modalsToDismissArray addObject:@"modal_id_1"];
13
+	[store.modalsToDismissArray addObject:@"modal_id_2"];
14
+	[store.modalsToDismissArray addObject:@"modal_id_3"];
15
+	
16
+	RNNModalManager *modalManager = [[RNNModalManager alloc] initWithStore:store];
17
+	[modalManager dismissAllModals];
18
+	
19
+	XCTAssertTrue([store.modalsToDismissArray count] == 0);
20
+	
21
+}
22
+
23
+@end

+ 6
- 0
playground/src/containers/ModalScreen.js 파일 보기

@@ -18,6 +18,7 @@ class ModalScreen extends Component {
18 18
     this.onClickDismissUnknownModal = this.onClickDismissUnknownModal.bind(this);
19 19
     this.onClickDismissAllPreviousModals = this.onClickDismissAllPreviousModals.bind(this);
20 20
     this.onClickDismissFirstInStack = this.onClickDismissFirstInStack.bind(this);
21
+    this.onClickDismissAllModals = this.onClickDismissAllModals.bind(this);
21 22
   }
22 23
   render() {
23 24
     return (
@@ -27,6 +28,7 @@ class ModalScreen extends Component {
27 28
         <Button title="Show Modal" onPress={this.onClickShowModal} />
28 29
         <Button title="Dismiss Modal" onPress={this.onClickDismissModal} />
29 30
         <Button title="Dismiss Unknown Modal" onPress={this.onClickDismissUnknownModal} />
31
+        <Button title="Dismiss All Modals" onPress={this.onClickDismissAllModals} />
30 32
         {this.getPreviousModalId() ? (<Button title="Dismiss Previous Modal" onPress={this.onClickDismissPreviousModal} />) : undefined}
31 33
         {this.props.previousModalIds ? (<Button title="Dismiss ALL Previous Modals" onPress={this.onClickDismissAllPreviousModals} />) : undefined}
32 34
         {this.props.previousModalIds ? (<Button title="Dismiss First In Stack" onPress={this.onClickDismissFirstInStack} />) : undefined}
@@ -65,6 +67,10 @@ class ModalScreen extends Component {
65 67
   onClickDismissFirstInStack() {
66 68
     Navigation.dismissModal(_.head(this.props.previousModalIds));
67 69
   }
70
+  
71
+  onClickDismissAllModals() {
72
+    Navigation.dismissAllModals();
73
+  }
68 74
 
69 75
   getModalPosition() {
70 76
     return (this.props.modalPosition || 1);