Ran Greenberg 8 år sedan
förälder
incheckning
f70d6de710
5 ändrade filer med 47 tillägg och 8 borttagningar
  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 Visa fil

@@ -64,16 +64,26 @@ RCT_EXPORT_METHOD(dismissModal:(NSString*)containerId)
64 64
 		
65 65
 		if (root == topVC) {
66 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 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 87
 - (void)assertReady
78 88
 {
79 89
 	if (![RNN instance].isReadyToReceiveCommands) {

+ 1
- 1
ios/RNNStore.h Visa fil

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

+ 2
- 0
ios/RNNStore.m Visa fil

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

+ 15
- 0
playground/e2e/app.test.js Visa fil

@@ -81,6 +81,21 @@ describe('app', () => {
81 81
     elementByLabel('Dismiss Modal').tap();
82 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 101
 describe('reload app', () => {

+ 15
- 3
playground/src/containers/ModalScreen.js Visa fil

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