Browse Source

added side menu that works!

Ran Greenberg 7 years ago
parent
commit
7ce412b14f

+ 5
- 1
ios/RNNBridgeModule.m View File

@@ -17,7 +17,11 @@ RCT_EXPORT_METHOD(setRoot:(NSDictionary*)layout)
17 17
 {
18 18
 	[self assertReady];
19 19
 	RNNControllerFactory *factory = [[RNNControllerFactory alloc] initWithRootViewCreator:[RNNReactRootViewCreator new]];
20
-	UIApplication.sharedApplication.delegate.window.rootViewController = [factory createLayout:layout];
20
+	UIViewController *vc = [factory createLayout:layout];
21
+//	if([vc isKindOfClass:[RNNSideMenuController class]]) {
22
+//		vc = ((RNNSideMenuController*)vc).sideMenu;
23
+//	}
24
+	UIApplication.sharedApplication.delegate.window.rootViewController = vc;
21 25
 	[UIApplication.sharedApplication.delegate.window makeKeyAndVisible];
22 26
 }
23 27
 

+ 7
- 48
ios/RNNControllerFactory.m View File

@@ -52,14 +52,14 @@
52 52
 	}
53 53
 	
54 54
 	else if (node.isSideMenuCenter) {
55
-		return [self createSideMenuCenter:node];
55
+		return [self createSideMenuChild:node type:RNNSideMenuChildTypeCenter];
56 56
 	}
57 57
 	
58 58
 	else if (node.isSideMenuLeft) {
59
-		return [self createSideMenuLeft:node];
59
+		return [self createSideMenuChild:node type:RNNSideMenuChildTypeLeft];
60 60
 	}
61 61
 	else if (node.isSideMenuRight) {
62
-		return [self createSideMenuRight:node];
62
+		return [self createSideMenuChild:node type:RNNSideMenuChildTypeRight];
63 63
 	}
64 64
 	
65 65
 	@throw [NSException exceptionWithName:@"UnknownControllerType" reason:[@"Unknown controller type " stringByAppendingString:node.type] userInfo:nil];
@@ -101,34 +101,7 @@
101 101
 }
102 102
 
103 103
 -(UIViewController*)createSideMenu:(RNNLayoutNode*)node
104
-{
105
-	//	NSArray *childern = node.children;
106
-	//	id center, left, right;
107
-	
108
-	//	for (NSDictionary *child in childern) {
109
-	//		RNNLayoutNode *childNode = [RNNLayoutNode create:child];
110
-	//		UIViewController *vc = [self fromTree:child];
111
-	//
112
-	//		if ([childNode isSideMenuLeft]) {
113
-	//			left = vc;
114
-	//		}
115
-	//		else if ([childNode isSideMenuCenter]) {
116
-	//			center = vc;
117
-	//		}
118
-	//		else if ([childNode isSideMenuRight]) {
119
-	//			right = [self fromTree:child];
120
-	//		}
121
-	//		else {
122
-	//			@throw [NSException exceptionWithName:@"UnknownSideMenuType" reason:[@"Unknown side menu type for side menu root node " stringByAppendingString:childNode.type] userInfo:nil];
123
-	//		}
124
-	//	}
125
-	
126
-	//	if (!center) {
127
-	//		@throw [NSException exceptionWithName:@"WrongSideMenuDefinition" reason:@"Side menu without center is illigal" userInfo:nil];
128
-	//	}
129
-	//
130
-	//	MMDrawerController *sideMenu = [[MMDrawerController alloc] initWithCenterViewController:center leftDrawerViewController:left rightDrawerViewController:right];
131
-	
104
+{	
132 105
 	NSMutableArray* childrenVCs = [NSMutableArray new];
133 106
 	
134 107
 	
@@ -142,28 +115,14 @@
142 115
 }
143 116
 
144 117
 
145
--(UIViewController*)createSideMenuCenter:(RNNLayoutNode*)node {
146
-	UIViewController* child = [self fromTree:node.children[0]];
147
-	RNNSideMenuChildVC *center = [[RNNSideMenuChildVC alloc] initWithChild: child type:RNNSideMenuChildTypeCenter];
148
-	
149
-	return center;
150
-}
151
-
152
-
153
--(UIViewController*)createSideMenuLeft:(RNNLayoutNode*)node {
118
+-(UIViewController*)createSideMenuChild:(RNNLayoutNode*)node type:(RNNSideMenuChildType)type {
154 119
 	UIViewController* child = [self fromTree:node.children[0]];
155
-	RNNSideMenuChildVC *left = [[RNNSideMenuChildVC alloc] initWithChild: child type:RNNSideMenuChildTypeLeft];
120
+	RNNSideMenuChildVC *sideMenuChild = [[RNNSideMenuChildVC alloc] initWithChild: child type:type];
156 121
 	
157
-	return left;
122
+	return sideMenuChild;
158 123
 }
159 124
 
160 125
 
161
--(UIViewController*)createSideMenuRight:(RNNLayoutNode*)node {
162
-	UIViewController* child = [self fromTree:node.children[0]];
163
-	RNNSideMenuChildVC *right = [[RNNSideMenuChildVC alloc] initWithChild: child type:RNNSideMenuChildTypeRight];
164
-	
165
-	return right;
166
-}
167 126
 
168 127
 
169 128
 @end

+ 1
- 1
ios/RNNSideMenu/MMDrawerController/MMDrawerController.m View File

@@ -1526,4 +1526,4 @@ static inline CGFloat originXForDrawerOriginAndTargetOriginOffset(CGFloat origin
1526 1526
     return (CGRectContainsPoint(rightBezelRect, point) &&
1527 1527
             [self isPointContainedWithinCenterViewContentRect:point]);
1528 1528
 }
1529
-@end
1529
+@end

+ 7
- 0
ios/RNNSideMenuChildVC.m View File

@@ -21,6 +21,13 @@
21 21
 	self = [super init];
22 22
 	
23 23
 	self.child = child;
24
+	[self addChildViewController:self.child];
25
+	
26
+	[self addChildViewController:self.child];
27
+	[self.child.view setFrame:self.view.bounds];
28
+	[self.view addSubview:self.child.view];
29
+	[self.view bringSubviewToFront:self.child.view];
30
+	
24 31
 	self.type = type;
25 32
 	
26 33
 	return self;

+ 2
- 0
ios/RNNSideMenuController.h View File

@@ -8,12 +8,14 @@
8 8
 
9 9
 #import <UIKit/UIKit.h>
10 10
 #import "RNNSideMenuChildVC.h"
11
+#import "MMDrawerController.h"
11 12
 
12 13
 @interface RNNSideMenuController : UIViewController
13 14
 
14 15
 @property (readonly) RNNSideMenuChildVC *center;
15 16
 @property (readonly) RNNSideMenuChildVC *left;
16 17
 @property (readonly) RNNSideMenuChildVC *right;
18
+@property (readonly) MMDrawerController *sideMenu;
17 19
 
18 20
 -(instancetype)initWithControllers:(NSArray*)controllers;
19 21
 

+ 18
- 5
ios/RNNSideMenuController.m View File

@@ -8,23 +8,36 @@
8 8
 
9 9
 #import "RNNSideMenuController.h"
10 10
 #import "RNNSideMenuChildVC.h"
11
+#import "MMDrawerController.h"
11 12
 
12 13
 @interface RNNSideMenuController ()
13 14
 
14 15
 @property (readwrite) RNNSideMenuChildVC *center;
15 16
 @property (readwrite) RNNSideMenuChildVC *left;
16 17
 @property (readwrite) RNNSideMenuChildVC *right;
18
+@property (readwrite) MMDrawerController *sideMenu;
17 19
 
18 20
 @end
19 21
 
20 22
 @implementation RNNSideMenuController
21 23
 
22 24
 -(instancetype)initWithControllers:(NSArray*)controllers;
23
- {
25
+{
24 26
 	self = [super init];
25
-
26
-	 [self setControllers:controllers];
27
-	 
27
+	
28
+	[self setControllers:controllers];
29
+	
30
+	self.sideMenu = [[MMDrawerController alloc] initWithCenterViewController:self.center leftDrawerViewController:self.left rightDrawerViewController:self.right];
31
+	
32
+	self.sideMenu.openDrawerGestureModeMask = MMOpenDrawerGestureModeAll;
33
+	self.sideMenu.closeDrawerGestureModeMask = MMOpenDrawerGestureModeAll;
34
+	
35
+	[self addChildViewController:self.sideMenu];
36
+	[self.sideMenu.view setFrame:self.view.bounds];
37
+	[self.view addSubview:self.sideMenu.view];
38
+	[self.view bringSubviewToFront:self.sideMenu.view];
39
+	
40
+	
28 41
 	return self;
29 42
 }
30 43
 
@@ -44,7 +57,7 @@
44 57
 				self.right = child;
45 58
 			}
46 59
 		}
47
-
60
+		
48 61
 		else {
49 62
 			@throw [NSException exceptionWithName:@"UnknownSideMenuControllerType" reason:[@"Unknown side menu type " stringByAppendingString:[controller description]] userInfo:nil];
50 63
 		}

+ 3
- 3
playground/e2e/app.test.js View File

@@ -18,9 +18,9 @@ describe('app', () => {
18 18
     expect(elementByLabel('Pushed screen')).toBeVisible();
19 19
   });
20 20
 
21
-  xit('switch to tabs with side menus', () => {
22
-    elementByLabel('Switch to tab based app with side menus').tap();
23
-    elementByLabel('Switch to tab based app with side menus').swipeRight();
21
+  it('switch to tabs with side menus', () => {
22
+    elementByLabel('Switch to app with side menus').tap();
23
+    elementByLabel('This is a side menu center screen').swipe('right');
24 24
     expect(elementByLabel('This is a side menu screen')).toBeVisible();
25 25
   });
26 26
 

+ 73
- 28
playground/ios/playgroundTests/RNNControllerFactoryTest.m View File

@@ -100,34 +100,35 @@
100 100
 
101 101
 
102 102
 - (void)testCreateLayout_ContainerSideMenuLayoutCenterLeftRight {
103
-	RNNSideMenuController *ans = (RNNSideMenuController*) [self.factory createLayout:@{@"id": @"cntId",
104
-																					   @"type": @"SideMenuRoot",
105
-																					   @"data": @{},
106
-																					   @"children": @[
107
-																							   @{@"id": @"cntI_2",
108
-																								 @"type": @"SideMenuCenter",
109
-																								 @"data": @{},
110
-																								 @"children": @[
111
-																										 @{@"id": @"cntId_3",
112
-																										   @"type": @"Container",
113
-																										   @"data": @{},
114
-																										   @"children": @[]}]},
115
-																							   @{@"id": @"cntI_4",
116
-																								 @"type": @"SideMenuLeft",
117
-																								 @"data": @{},
118
-																								 @"children": @[
119
-																										 @{@"id": @"cntId_5",
120
-																										   @"type": @"Container",
121
-																										   @"data": @{},
122
-																										   @"children": @[]}]},
123
-																							   @{@"id": @"cntI_6",
124
-																								 @"type": @"SideMenuRight",
125
-																								 @"data": @{},
126
-																								 @"children": @[
127
-																										 @{@"id": @"cntId_5",
128
-																										   @"type": @"Container",
129
-																										   @"data": @{},
130
-																										   @"children": @[]}]}]}];
103
+	RNNSideMenuController *ans = (RNNSideMenuController*) [self.factory createLayout:
104
+														   @{@"id": @"cntId",
105
+															 @"type": @"SideMenuRoot",
106
+															 @"data": @{},
107
+															 @"children": @[
108
+																	 @{@"id": @"cntI_2",
109
+																	   @"type": @"SideMenuCenter",
110
+																	   @"data": @{},
111
+																	   @"children": @[
112
+																			   @{@"id": @"cntId_3",
113
+																				 @"type": @"Container",
114
+																				 @"data": @{},
115
+																				 @"children": @[]}]},
116
+																	 @{@"id": @"cntI_4",
117
+																	   @"type": @"SideMenuLeft",
118
+																	   @"data": @{},
119
+																	   @"children": @[
120
+																			   @{@"id": @"cntId_5",
121
+																				 @"type": @"Container",
122
+																				 @"data": @{},
123
+																				 @"children": @[]}]},
124
+																	 @{@"id": @"cntI_6",
125
+																	   @"type": @"SideMenuRight",
126
+																	   @"data": @{},
127
+																	   @"children": @[
128
+																			   @{@"id": @"cntId_5",
129
+																				 @"type": @"Container",
130
+																				 @"data": @{},
131
+																				 @"children": @[]}]}]}];
131 132
 	XCTAssertTrue([ans isMemberOfClass:[RNNSideMenuController class]]);
132 133
 	XCTAssertTrue([ans isKindOfClass:[UIViewController class]]);
133 134
 	XCTAssertTrue([ans.center isMemberOfClass:[RNNSideMenuChildVC class]]);
@@ -144,6 +145,50 @@
144 145
 	XCTAssertTrue([right.child isMemberOfClass:[RNNRootViewController class]]);
145 146
 }
146 147
 
148
+- (void)testCreateLayout_ContainerSideMenuLayoutCenterTabBar {
149
+	RNNSideMenuController *ans = (RNNSideMenuController*) [self.factory createLayout:
150
+														   @{@"id": @"cntId",
151
+															 @"type": @"SideMenuRoot",
152
+															 @"data": @{},
153
+															 @"children": @[
154
+																	 @{@"id": @"cntI_2",
155
+																	   @"type": @"SideMenuCenter",
156
+																	   @"data": @{},
157
+																	   @"children": @[
158
+																			   @{@"id": @"cntId_3",
159
+																				 @"type": @"BottomTabs",
160
+																				 @"data": @{},
161
+																				 @"children": @[
162
+																						 @{@"id": @"cntId_4",
163
+																						   @"type": @"ContainerStack",
164
+																						   @"data": @{},
165
+																						   @"children": @[
166
+																								   @{@"id": @"cntId_2",
167
+																									 @"type": @"Container",
168
+																									 @"data": @{},
169
+																									 @"children": @[]}]}]}]}]}
170
+														   ];
171
+	
172
+	XCTAssertTrue([ans isMemberOfClass:[RNNSideMenuController class]]);
173
+	XCTAssertTrue([ans isKindOfClass:[UIViewController class]]);
174
+	XCTAssertTrue([ans.center isMemberOfClass:[RNNSideMenuChildVC class]]);
175
+	
176
+	RNNSideMenuChildVC *center = (RNNSideMenuChildVC*)ans.center;
177
+	XCTAssertTrue(center.type == RNNSideMenuChildTypeCenter);
178
+	XCTAssertTrue([center.child isMemberOfClass:[UITabBarController class]]);
179
+	
180
+	UITabBarController *tabbBar = (UITabBarController*)center.child;
181
+	XCTAssertTrue(tabbBar.viewControllers.count == 1);
182
+	
183
+	UINavigationController *navController = (UINavigationController*)(tabbBar.viewControllers[0]);
184
+	XCTAssertTrue([navController isMemberOfClass:[UINavigationController class]]);
185
+	XCTAssertTrue(navController.viewControllers.count == 1);
186
+	
187
+	RNNRootViewController *rootViewController = (RNNRootViewController*)navController.viewControllers[0];
188
+	XCTAssertTrue([rootViewController isMemberOfClass:[RNNRootViewController class]]);
189
+	
190
+}
191
+
147 192
 
148 193
 
149 194
 @end

+ 8
- 2
playground/src/containers/WelcomeScreen.js View File

@@ -51,7 +51,10 @@ class WelcomeScreen extends Component {
51 51
       tabs: [
52 52
         {
53 53
           container: {
54
-            name: 'navigation.playground.SimpleScreen'
54
+            name: 'navigation.playground.SimpleScreen',
55
+            passProps: {
56
+              text: 'This is a side menu center screen'
57
+            }
55 58
           }
56 59
         },
57 60
         {
@@ -68,7 +71,10 @@ class WelcomeScreen extends Component {
68 71
       sideMenu: {
69 72
         left: {
70 73
           container: {
71
-            name: 'navigation.playground.SimpleScreen'
74
+            name: 'navigation.playground.SimpleScreen',
75
+            passProps: {
76
+              text: 'This is a side menu screen'
77
+            }
72 78
           }
73 79
         },
74 80
         right: {