Browse Source

#830 dismissAllModals

Ran Greenberg 8 years ago
parent
commit
b9af609e37

+ 6
- 0
ios/RNNBridgeModule.m View File

58
 	[[[RNNModalManager alloc] initWithStore:[RNN instance].store] dismissModal:containerId];
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
 - (void)assertReady
69
 - (void)assertReady

+ 1
- 0
ios/RNNModalManager.h View File

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

+ 8
- 0
ios/RNNModalManager.m View File

25
 	[self removePendingNextModalIfOnTop];
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
 #pragma mark - private
35
 #pragma mark - private
29
 
36
 
37
+
30
 -(void)removePendingNextModalIfOnTop {
38
 -(void)removePendingNextModalIfOnTop {
31
 	NSString *containerId = [self.store.modalsToDismissArray lastObject];
39
 	NSString *containerId = [self.store.modalsToDismissArray lastObject];
32
 	
40
 	

+ 7
- 2
playground/e2e/app.test.js View File

115
     expect(elementByLabel('React Native Navigation!')).toBeVisible();
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 View File

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

+ 23
- 0
playground/ios/playgroundTests/RNNModalManagerTest.m View File

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 View File

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