Ran Greenberg 8 years ago
parent
commit
f70d6de710
5 changed files with 47 additions and 8 deletions
  1. 14
    4
      ios/RNNBridgeModule.m
  2. 1
    1
      ios/RNNStore.h
  3. 2
    0
      ios/RNNStore.m
  4. 15
    0
      playground/e2e/app.test.js
  5. 15
    3
      playground/src/containers/ModalScreen.js

+ 14
- 4
ios/RNNBridgeModule.m View File

64
 		
64
 		
65
 		if (root == topVC) {
65
 		if (root == topVC) {
66
 			[root dismissViewControllerAnimated:YES completion:nil];
66
 			[root dismissViewControllerAnimated:YES completion:nil];
67
-			[[RNN instance].store.modalToDismiss dismissViewControllerAnimated:YES completion:nil];
68
-			[RNN instance].store.modalToDismiss = nil;
69
-			
67
+			[self removeNextModal];
70
 		}
68
 		}
71
 		else {
69
 		else {
72
-			[RNN instance].store.modalToDismiss = root;
70
+			[[RNN instance].store.modalsToDismissArray addObject:containerId];
73
 		}
71
 		}
74
 	}
72
 	}
75
 }
73
 }
76
 
74
 
75
+-(void)removeNextModal {
76
+	NSString *nextContainerId = [[RNN instance].store.modalsToDismissArray lastObject];
77
+	UIViewController *vc = [[RNN instance].store findContainerForId:nextContainerId];
78
+	
79
+	if (vc) {
80
+		[vc dismissViewControllerAnimated:YES completion:^{
81
+			[[RNN instance].store.modalsToDismissArray removeObject:nextContainerId];
82
+			[self removeNextModal];
83
+		}];
84
+	}
85
+}
86
+
77
 - (void)assertReady
87
 - (void)assertReady
78
 {
88
 {
79
 	if (![RNN instance].isReadyToReceiveCommands) {
89
 	if (![RNN instance].isReadyToReceiveCommands) {

+ 1
- 1
ios/RNNStore.h View File

12
 
12
 
13
 @interface RNNStore : NSObject
13
 @interface RNNStore : NSObject
14
 
14
 
15
-@property UIViewController *modalToDismiss;
15
+@property NSMutableArray *modalsToDismissArray;
16
 
16
 
17
 - (UIViewController*)findContainerForId:(NSString*)containerId;
17
 - (UIViewController*)findContainerForId:(NSString*)containerId;
18
 - (void)setContainer:(UIViewController*)viewController containerId:(NSString*)containerId;
18
 - (void)setContainer:(UIViewController*)viewController containerId:(NSString*)containerId;

+ 2
- 0
ios/RNNStore.m View File

12
 
12
 
13
 @property NSMapTable *containerStore;
13
 @property NSMapTable *containerStore;
14
 
14
 
15
+
15
 @end
16
 @end
16
 
17
 
17
 @implementation RNNStore
18
 @implementation RNNStore
20
 -(instancetype)init {
21
 -(instancetype)init {
21
 	self = [super init];
22
 	self = [super init];
22
 	self.containerStore = [NSMapTable strongToWeakObjectsMapTable];
23
 	self.containerStore = [NSMapTable strongToWeakObjectsMapTable];
24
+	self.modalsToDismissArray = [NSMutableArray new];
23
 	return self;
25
 	return self;
24
 }
26
 }
25
 
27
 

+ 15
- 0
playground/e2e/app.test.js View File

81
     elementByLabel('Dismiss Modal').tap();
81
     elementByLabel('Dismiss Modal').tap();
82
     expect(elementByLabel('React Native Navigation!')).toBeVisible();
82
     expect(elementByLabel('React Native Navigation!')).toBeVisible();
83
   });
83
   });
84
+  
85
+  it('dismiss all previous modals by id when they are below top presented modal', () => {
86
+    elementByLabel('Show Modal').tap();
87
+    expect(elementByLabel('Modal Stack Position: 1')).toBeVisible();
88
+    elementByLabel('Show Modal').tap();
89
+    expect(elementByLabel('Modal Stack Position: 2')).toBeVisible();
90
+    elementByLabel('Show Modal').tap();
91
+    expect(elementByLabel('Modal Stack Position: 3')).toBeVisible();
92
+    
93
+    elementByLabel('Dismiss ALL Previous Modals').tap();
94
+    expect(elementByLabel('Modal Stack Position: 3')).toBeVisible();
95
+    
96
+    elementByLabel('Dismiss Modal').tap();
97
+    expect(elementByLabel('React Native Navigation!')).toBeVisible();
98
+  });
84
 });
99
 });
85
 
100
 
86
 describe('reload app', () => {
101
 describe('reload app', () => {

+ 15
- 3
playground/src/containers/ModalScreen.js View File

1
+import _ from 'lodash';
1
 import React, { Component } from 'react';
2
 import React, { Component } from 'react';
2
 import {
3
 import {
3
   StyleSheet,
4
   StyleSheet,
15
     this.onClickDismissModal = this.onClickDismissModal.bind(this);
16
     this.onClickDismissModal = this.onClickDismissModal.bind(this);
16
     this.onClickDismissPreviousModal = this.onClickDismissPreviousModal.bind(this);
17
     this.onClickDismissPreviousModal = this.onClickDismissPreviousModal.bind(this);
17
     this.onClickDismissUnknownModal = this.onClickDismissUnknownModal.bind(this);
18
     this.onClickDismissUnknownModal = this.onClickDismissUnknownModal.bind(this);
19
+    this.onClickDismissAllPreviousModals = this.onClickDismissAllPreviousModals.bind(this);
18
   }
20
   }
19
   render() {
21
   render() {
20
     return (
22
     return (
24
         <Button title="Show Modal" onPress={this.onClickShowModal} />
26
         <Button title="Show Modal" onPress={this.onClickShowModal} />
25
         <Button title="Dismiss Modal" onPress={this.onClickDismissModal} />
27
         <Button title="Dismiss Modal" onPress={this.onClickDismissModal} />
26
         <Button title="Dismiss Unknown Modal" onPress={this.onClickDismissUnknownModal} />
28
         <Button title="Dismiss Unknown Modal" onPress={this.onClickDismissUnknownModal} />
27
-        {this.props.previousModalId ? (<Button title="Dismiss Previous Modal" onPress={this.onClickDismissPreviousModal} />) : undefined}
29
+        {this.getPreviousModalId() ? (<Button title="Dismiss Previous Modal" onPress={this.onClickDismissPreviousModal} />) : undefined}
30
+        {this.props.previousModalIds ? (<Button title="Dismiss ALL Previous Modals" onPress={this.onClickDismissAllPreviousModals} />) : undefined}
28
         <Text style={styles.footer}>{`this.props.id = ${this.props.id}`}</Text>
31
         <Text style={styles.footer}>{`this.props.id = ${this.props.id}`}</Text>
29
         
32
         
30
       </View>
33
       </View>
36
       name: 'navigation.playground.ModalScreen',
39
       name: 'navigation.playground.ModalScreen',
37
       passProps: {
40
       passProps: {
38
         modalPosition: this.getModalPosition() + 1,
41
         modalPosition: this.getModalPosition() + 1,
39
-        previousModalId: this.props.id
42
+        previousModalIds: _.concat([], this.props.previousModalIds, this.props.id)
40
       }
43
       }
41
     });
44
     });
42
   }
45
   }
46
   }
49
   }
47
 
50
 
48
   onClickDismissPreviousModal() {
51
   onClickDismissPreviousModal() {
49
-    Navigation.dismissModal(this.props.previousModalId);
52
+    Navigation.dismissModal(this.getPreviousModalId());
50
   }
53
   }
54
+  
51
   onClickDismissUnknownModal() {
55
   onClickDismissUnknownModal() {
52
     Navigation.dismissModal('unknown');
56
     Navigation.dismissModal('unknown');
53
   }
57
   }
58
+  
59
+  onClickDismissAllPreviousModals() {
60
+    _.forEach(this.props.previousModalIds, (id) => Navigation.dismissModal(id));
61
+  }
54
 
62
 
55
   getModalPosition() {
63
   getModalPosition() {
56
     return (this.props.modalPosition || 1);
64
     return (this.props.modalPosition || 1);
57
   }
65
   }
66
+  
67
+  getPreviousModalId() {
68
+    return _.last(this.props.previousModalIds);
69
+  }
58
 }
70
 }
59
 
71
 
60
 const styles = {
72
 const styles = {