yogevbd 6 years ago
parent
commit
fbf8ea1387

+ 12
- 8
lib/ios/RNNControllerFactory.m View File

96
 
96
 
97
 - (UIViewController<RNNRootViewProtocol> *)createComponent:(RNNLayoutNode*)node {
97
 - (UIViewController<RNNRootViewProtocol> *)createComponent:(RNNLayoutNode*)node {
98
 	NSString* name = node.data[@"name"];
98
 	NSString* name = node.data[@"name"];
99
-	RNNNavigationOptions* options = [[RNNNavigationOptions alloc] initWithDict:_defaultOptionsDict];
100
-	[options mergeWith:node.data[@"options"]];
99
+	RNNNavigationOptions* options = [self createOptions:node.data[@"options"]];
101
 
100
 
102
 	NSString* componentId = node.nodeId;
101
 	NSString* componentId = node.nodeId;
103
 	RNNRootViewController* component = [[RNNRootViewController alloc] initWithName:name withOptions:options withComponentId:componentId rootViewCreator:_creator eventEmitter:_eventEmitter isExternalComponent:NO];
102
 	RNNRootViewController* component = [[RNNRootViewController alloc] initWithName:name withOptions:options withComponentId:componentId rootViewCreator:_creator eventEmitter:_eventEmitter isExternalComponent:NO];
113
 	NSDictionary* props = node.data[@"passProps"];
112
 	NSDictionary* props = node.data[@"passProps"];
114
 	
113
 	
115
 	UIViewController* externalVC = [_store getExternalComponent:name props:props bridge:_bridge];
114
 	UIViewController* externalVC = [_store getExternalComponent:name props:props bridge:_bridge];
116
-	RNNNavigationOptions* options = [[RNNNavigationOptions alloc] initWithDict:_defaultOptionsDict];
117
-	[options mergeWith:node.data[@"options"]];
115
+	RNNNavigationOptions* options = [self createOptions:node.data[@"options"]];
118
 	
116
 	
119
 	NSString* componentId = node.nodeId;
117
 	NSString* componentId = node.nodeId;
120
 	RNNRootViewController* component = [[RNNRootViewController alloc] initWithName:name withOptions:options withComponentId:componentId rootViewCreator:_creator eventEmitter:_eventEmitter isExternalComponent:YES];
118
 	RNNRootViewController* component = [[RNNRootViewController alloc] initWithName:name withOptions:options withComponentId:componentId rootViewCreator:_creator eventEmitter:_eventEmitter isExternalComponent:YES];
130
 - (UIViewController<RNNRootViewProtocol> *)createStack:(RNNLayoutNode*)node {
128
 - (UIViewController<RNNRootViewProtocol> *)createStack:(RNNLayoutNode*)node {
131
 	RNNNavigationController* vc = [[RNNNavigationController alloc] init];
129
 	RNNNavigationController* vc = [[RNNNavigationController alloc] init];
132
 	[vc setComponentId:node.nodeId];
130
 	[vc setComponentId:node.nodeId];
133
-	NSDictionary* options = node.data[@"options"];
131
+	RNNNavigationOptions* options = [self createOptions:node.data[@"options"]];
134
 	NSMutableArray* controllers = [NSMutableArray new];
132
 	NSMutableArray* controllers = [NSMutableArray new];
135
 	for (NSDictionary* child in node.children) {
133
 	for (NSDictionary* child in node.children) {
136
 		[controllers addObject:[self fromTree:child]];
134
 		[controllers addObject:[self fromTree:child]];
143
 
141
 
144
 -(UIViewController<RNNRootViewProtocol> *)createTabs:(RNNLayoutNode*)node {
142
 -(UIViewController<RNNRootViewProtocol> *)createTabs:(RNNLayoutNode*)node {
145
 	RNNTabBarController* vc = [[RNNTabBarController alloc] initWithEventEmitter:_eventEmitter];
143
 	RNNTabBarController* vc = [[RNNTabBarController alloc] initWithEventEmitter:_eventEmitter];
146
-	NSDictionary* options = node.data[@"options"];
144
+	RNNNavigationOptions* options = [self createOptions:node.data[@"options"]];
147
 
145
 
148
 	NSMutableArray* controllers = [NSMutableArray new];
146
 	NSMutableArray* controllers = [NSMutableArray new];
149
 	for (NSDictionary *child in node.children) {
147
 	for (NSDictionary *child in node.children) {
178
 - (UIViewController<RNNRootViewProtocol> *)createSideMenu:(RNNLayoutNode*)node {
176
 - (UIViewController<RNNRootViewProtocol> *)createSideMenu:(RNNLayoutNode*)node {
179
 	NSMutableArray* childrenVCs = [NSMutableArray new];
177
 	NSMutableArray* childrenVCs = [NSMutableArray new];
180
 	
178
 	
181
-	
182
 	for (NSDictionary *child in node.children) {
179
 	for (NSDictionary *child in node.children) {
183
 		UIViewController *vc = [self fromTree:child];
180
 		UIViewController *vc = [self fromTree:child];
184
 		[childrenVCs addObject:vc];
181
 		[childrenVCs addObject:vc];
185
 	}
182
 	}
186
 	RNNSideMenuController *sideMenu = [[RNNSideMenuController alloc] initWithControllers:childrenVCs];
183
 	RNNSideMenuController *sideMenu = [[RNNSideMenuController alloc] initWithControllers:childrenVCs];
184
+	[sideMenu mergeOptions:[self createOptions:node.data[@"options"]]];
187
 	return sideMenu;
185
 	return sideMenu;
188
 }
186
 }
189
 
187
 
190
 
188
 
191
 - (UIViewController<RNNRootViewProtocol> *)createSideMenuChild:(RNNLayoutNode*)node type:(RNNSideMenuChildType)type {
189
 - (UIViewController<RNNRootViewProtocol> *)createSideMenuChild:(RNNLayoutNode*)node type:(RNNSideMenuChildType)type {
192
-	UIViewController* child = (UIViewController*)[self fromTree:node.children[0]];
190
+	UIViewController<RNNRootViewProtocol>* child = [self fromTree:node.children[0]];
193
 	RNNSideMenuChildVC *sideMenuChild = [[RNNSideMenuChildVC alloc] initWithChild: child type:type];
191
 	RNNSideMenuChildVC *sideMenuChild = [[RNNSideMenuChildVC alloc] initWithChild: child type:type];
194
 	
192
 	
195
 	return sideMenuChild;
193
 	return sideMenuChild;
234
 	return svc;
232
 	return svc;
235
 }
233
 }
236
 
234
 
235
+- (RNNNavigationOptions *)createOptions:(NSDictionary *)optionsDict {
236
+	RNNNavigationOptions* options = [[RNNNavigationOptions alloc] initWithDict:_defaultOptionsDict];
237
+	[options mergeWith:optionsDict];
238
+	return options;
239
+}
240
+
237
 @end
241
 @end

+ 1
- 1
lib/ios/RNNNavigationController.m View File

20
 	return [self.getTopViewController isCustomViewController];
20
 	return [self.getTopViewController isCustomViewController];
21
 }
21
 }
22
 
22
 
23
-- (void)mergeOptions:(NSDictionary *)options {
23
+- (void)mergeOptions:(RNNOptions *)options {
24
 	[self.getTopViewController mergeOptions:options];
24
 	[self.getTopViewController mergeOptions:options];
25
 }
25
 }
26
 
26
 

+ 2
- 1
lib/ios/RNNOptions.h View File

16
 
16
 
17
 - (instancetype)initWithDict:(NSDictionary*)dict;
17
 - (instancetype)initWithDict:(NSDictionary*)dict;
18
 - (void)mergeWith:(NSDictionary*)otherOptions;
18
 - (void)mergeWith:(NSDictionary*)otherOptions;
19
-- (void)mergeIfEmptyWith:(NSDictionary*)otherOptions;
20
 - (void)applyOn:(UIViewController *)viewController defaultOptions:(RNNOptions*)defaultOptions;
19
 - (void)applyOn:(UIViewController *)viewController defaultOptions:(RNNOptions*)defaultOptions;
21
 - (BOOL)hasProperty:(NSString*)propName;
20
 - (BOOL)hasProperty:(NSString*)propName;
21
+- (void)mergeOptions:(RNNOptions *)otherOptions;
22
+- (void)mergeOptions:(RNNOptions *)otherOptions overrideOptions:(BOOL)override;
22
 
23
 
23
 @end
24
 @end

+ 25
- 9
lib/ios/RNNOptions.m View File

30
 	}
30
 	}
31
 }
31
 }
32
 
32
 
33
--(void)mergeIfEmptyWith:(NSDictionary *)otherOptions {
34
-	for (id key in otherOptions) {
35
-		if ([self hasProperty:key]) {
36
-			if ([[self valueForKey:key] isKindOfClass:[RNNOptions class]]) {
37
-				RNNOptions* options = [self valueForKey:key];
38
-				[options mergeIfEmptyWith:[otherOptions objectForKey:key]];
39
-			} else if (![self valueForKey:key]) {
40
-				[self setValue:[otherOptions objectForKey:key] forKey:key];
41
-			}
33
+- (void)mergeOptions:(RNNOptions *)otherOptions overrideOptions:(BOOL)override {
34
+	for (id prop in [self objectProperties:otherOptions]) {
35
+		id value = [otherOptions valueForKey:prop];
36
+		if ([value isKindOfClass:[RNNOptions class]]) {
37
+			[[self valueForKey:prop] mergeOptions:value overrideOptions:override];
38
+		} else if (value && (override || ![self valueForKey:prop])) {
39
+			[self setValue:value forKey:prop];
42
 		}
40
 		}
43
 	}
41
 	}
44
 }
42
 }
45
 
43
 
44
+- (void)mergeOptions:(RNNOptions *)otherOptions {
45
+	[self mergeOptions:otherOptions overrideOptions:YES];
46
+}
47
+
46
 - (BOOL)hasProperty:(NSString*)propName {
48
 - (BOOL)hasProperty:(NSString*)propName {
47
 	return [self respondsToSelector:NSSelectorFromString(propName)];
49
 	return [self respondsToSelector:NSSelectorFromString(propName)];
48
 }
50
 }
71
 	free(props);
73
 	free(props);
72
 }
74
 }
73
 
75
 
76
+- (NSArray *)objectProperties:(NSObject *)object {
77
+	NSMutableArray* properties = [NSMutableArray new];
78
+	unsigned int count;
79
+	objc_property_t* props = class_copyPropertyList([object class], &count);
80
+	for (int i = 0; i < count; i++) {
81
+		objc_property_t property = props[i];
82
+		NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
83
+		[properties addObject:propertyName];
84
+	}
85
+	
86
+	free(props);
87
+	return properties;
88
+}
89
+
74
 @end
90
 @end

+ 2
- 2
lib/ios/RNNRootViewController.m View File

124
 	[self.options applyModalOptions:self];
124
 	[self.options applyModalOptions:self];
125
 }
125
 }
126
 
126
 
127
-- (void)mergeOptions:(NSDictionary *)options {
128
-	[self.options mergeIfEmptyWith:options];
127
+- (void)mergeOptions:(RNNOptions *)options {
128
+	[self.options mergeOptions:options overrideOptions:NO];
129
 }
129
 }
130
 
130
 
131
 - (void)setCustomNavigationTitleView {
131
 - (void)setCustomNavigationTitleView {

+ 1
- 1
lib/ios/RNNRootViewProtocol.h View File

3
 @protocol RNNRootViewProtocol <NSObject, UINavigationControllerDelegate, UIViewControllerTransitioningDelegate, UISplitViewControllerDelegate>
3
 @protocol RNNRootViewProtocol <NSObject, UINavigationControllerDelegate, UIViewControllerTransitioningDelegate, UISplitViewControllerDelegate>
4
 
4
 
5
 @optional
5
 @optional
6
-- (void)mergeOptions:(NSDictionary*)options;
6
+- (void)mergeOptions:(RNNOptions*)options;
7
 - (BOOL)isCustomViewController;
7
 - (BOOL)isCustomViewController;
8
 - (void)performOnRotation:(void (^)(void))block;
8
 - (void)performOnRotation:(void (^)(void))block;
9
 - (void)optionsUpdated;
9
 - (void)optionsUpdated;

+ 2
- 2
lib/ios/RNNSideMenuChildVC.h View File

19
 @interface RNNSideMenuChildVC : UIViewController <RNNRootViewProtocol>
19
 @interface RNNSideMenuChildVC : UIViewController <RNNRootViewProtocol>
20
 
20
 
21
 @property (readonly) RNNSideMenuChildType type;
21
 @property (readonly) RNNSideMenuChildType type;
22
-@property (readonly) UIViewController *child;
22
+@property (readonly) UIViewController<RNNRootViewProtocol> *child;
23
 
23
 
24
--(instancetype) initWithChild:(UIViewController*)child type:(RNNSideMenuChildType)type;
24
+-(instancetype) initWithChild:(UIViewController<RNNRootViewProtocol>*)child type:(RNNSideMenuChildType)type;
25
 
25
 
26
 @end
26
 @end

+ 4
- 0
lib/ios/RNNSideMenuChildVC.m View File

31
 	return self;
31
 	return self;
32
 }
32
 }
33
 
33
 
34
+- (void)mergeOptions:(RNNOptions *)options {
35
+	[self.child mergeOptions:options];
36
+}
37
+
34
 - (UIStatusBarStyle)preferredStatusBarStyle {
38
 - (UIStatusBarStyle)preferredStatusBarStyle {
35
 	return self.child.preferredStatusBarStyle;
39
 	return self.child.preferredStatusBarStyle;
36
 }
40
 }

+ 4
- 0
lib/ios/RNNSideMenuController.m View File

89
 	}
89
 	}
90
 }
90
 }
91
 
91
 
92
+- (void)mergeOptions:(RNNOptions *)options {
93
+	[self.center mergeOptions:options];
94
+}
95
+
92
 - (NSString *)componentId {
96
 - (NSString *)componentId {
93
 	return _center.componentId;
97
 	return _center.componentId;
94
 }
98
 }

+ 3
- 4
lib/ios/RNNSideMenuOptions.h View File

1
 #import "RNNOptions.h"
1
 #import "RNNOptions.h"
2
+#import "RNNSideMenuSideOptions.h"
2
 
3
 
3
 @interface RNNSideMenuOptions : RNNOptions
4
 @interface RNNSideMenuOptions : RNNOptions
4
 
5
 
5
-@property (nonatomic, strong) NSNumber* leftSideVisible;
6
-@property (nonatomic, strong) NSNumber* rightSideVisible;
7
-@property (nonatomic, strong) NSNumber* rightSideEnabled;
8
-@property (nonatomic, strong) NSNumber* leftSideEnabled;
6
+@property (nonatomic, strong) RNNSideMenuSideOptions* left;
7
+@property (nonatomic, strong) RNNSideMenuSideOptions* right;
9
 
8
 
10
 @end
9
 @end

+ 2
- 42
lib/ios/RNNSideMenuOptions.m View File

4
 @implementation RNNSideMenuOptions
4
 @implementation RNNSideMenuOptions
5
 
5
 
6
 - (void)applyOn:(UIViewController *)viewController {
6
 - (void)applyOn:(UIViewController *)viewController {
7
-	RNNSideMenuController* sideMenuController = (RNNSideMenuController*)UIApplication.sharedApplication.delegate.window.rootViewController;
8
-	if ([sideMenuController isKindOfClass:[RNNSideMenuController class]]) {
9
-		if (self.leftSideVisible) {
10
-			if (self.leftSideVisible.boolValue) {
11
-				[sideMenuController showSideMenu:MMDrawerSideLeft animated:YES];
12
-			} else {
13
-				[sideMenuController hideSideMenu:MMDrawerSideLeft animated:YES];
14
-			}
15
-		}
16
-		
17
-		if (self.rightSideVisible) {
18
-			if (self.rightSideVisible.boolValue) {
19
-				[sideMenuController showSideMenu:MMDrawerSideRight animated:YES];
20
-			} else {
21
-				[sideMenuController hideSideMenu:MMDrawerSideRight animated:YES];
22
-			}
23
-		}
24
-		
25
-		if (self.leftSideEnabled) {
26
-			sideMenuController.sideMenu.leftSideEnabled = [self.leftSideEnabled boolValue];
27
-		}
28
-		
29
-		if (self.rightSideEnabled) {
30
-			sideMenuController.sideMenu.rightSideEnabled = [self.rightSideEnabled boolValue];
31
-		}
32
-		
33
-		[self resetOptions];
34
-	}
35
-}
36
-
37
--(void)mergeWith:(NSDictionary *)otherOptions {
38
-	self.leftSideVisible = [[otherOptions valueForKey:@"left"] valueForKey:@"visible"];
39
-	self.rightSideVisible = [[otherOptions valueForKey:@"right"] valueForKey:@"visible"];
40
-	self.leftSideEnabled = [[otherOptions valueForKey:@"left"] valueForKey:@"enabled"];
41
-	self.rightSideEnabled = [[otherOptions valueForKey:@"right"] valueForKey:@"enabled"];
42
-}
43
-
44
--(void)resetOptions {
45
-	self.leftSideVisible = nil;
46
-	self.rightSideVisible = nil;
47
-	self.leftSideEnabled = nil;
48
-	self.rightSideEnabled = nil;
7
+	[self.left applyOnSide:MMDrawerSideLeft viewController:viewController];
8
+	[self.right applyOnSide:MMDrawerSideRight viewController:viewController];
49
 }
9
 }
50
 
10
 
51
 @end
11
 @end

+ 11
- 0
lib/ios/RNNSideMenuSideOptions.h View File

1
+#import "RNNOptions.h"
2
+#import "MMDrawerController.h"
3
+
4
+@interface RNNSideMenuSideOptions : RNNOptions
5
+
6
+- (void)applyOnSide:(MMDrawerSide)side viewController:(UIViewController *)viewController;
7
+
8
+@property (nonatomic, strong) NSNumber* visible;
9
+@property (nonatomic, strong) NSNumber* enabled;
10
+
11
+@end

+ 36
- 0
lib/ios/RNNSideMenuSideOptions.m View File

1
+#import "RNNSideMenuSideOptions.h"
2
+#import "RNNSideMenuController.h"
3
+
4
+@implementation RNNSideMenuSideOptions
5
+
6
+- (void)applyOnSide:(MMDrawerSide)side viewController:(UIViewController *)viewController {
7
+	RNNSideMenuController* sideMenuController = (RNNSideMenuController*)UIApplication.sharedApplication.delegate.window.rootViewController;
8
+	if (self.enabled) {
9
+		switch (side) {
10
+			case MMDrawerSideRight:
11
+				sideMenuController.sideMenu.rightSideEnabled = [self.enabled boolValue];
12
+				break;
13
+			case MMDrawerSideLeft:
14
+				sideMenuController.sideMenu.leftSideEnabled = [self.enabled boolValue];
15
+			default:
16
+				break;
17
+		}
18
+	}
19
+	
20
+	if (self.visible) {
21
+		if (self.visible.boolValue) {
22
+			[sideMenuController showSideMenu:side animated:YES];
23
+		} else {
24
+			[sideMenuController hideSideMenu:side animated:YES];
25
+		}
26
+	}
27
+	
28
+	[self resetOptions];
29
+}
30
+
31
+- (void)resetOptions {
32
+	self.visible = nil;
33
+	self.enabled = nil;
34
+}
35
+
36
+@end

+ 2
- 2
lib/ios/RNNSplitViewController.m View File

33
 - (void)optionsUpdated {
33
 - (void)optionsUpdated {
34
 }
34
 }
35
 
35
 
36
-- (void)mergeOptions:(NSDictionary *)options {
37
-	[self.options mergeIfEmptyWith:options];
36
+- (void)mergeOptions:(RNNOptions *)options {
37
+	[self.options mergeOptions:options];
38
 }
38
 }
39
 
39
 
40
 @end
40
 @end

+ 1
- 1
lib/ios/RNNTabBarController.m View File

41
 	}
41
 	}
42
 }
42
 }
43
 
43
 
44
-- (void)mergeOptions:(NSDictionary *)options {
44
+- (void)mergeOptions:(RNNOptions *)options {
45
 	[((UIViewController<RNNRootViewProtocol>*)self.selectedViewController) mergeOptions:options];
45
 	[((UIViewController<RNNRootViewProtocol>*)self.selectedViewController) mergeOptions:options];
46
 }
46
 }
47
 
47
 

+ 8
- 0
lib/ios/ReactNativeNavigation.xcodeproj/project.pbxproj View File

89
 		50570B272061473D006A1B5C /* RNNTitleOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 50570B252061473D006A1B5C /* RNNTitleOptions.m */; };
89
 		50570B272061473D006A1B5C /* RNNTitleOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 50570B252061473D006A1B5C /* RNNTitleOptions.m */; };
90
 		50570BEA2063E09B006A1B5C /* RNNTitleViewHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 50570BE82063E09B006A1B5C /* RNNTitleViewHelper.h */; };
90
 		50570BEA2063E09B006A1B5C /* RNNTitleViewHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 50570BE82063E09B006A1B5C /* RNNTitleViewHelper.h */; };
91
 		50570BEB2063E09B006A1B5C /* RNNTitleViewHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 50570BE92063E09B006A1B5C /* RNNTitleViewHelper.m */; };
91
 		50570BEB2063E09B006A1B5C /* RNNTitleViewHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 50570BE92063E09B006A1B5C /* RNNTitleViewHelper.m */; };
92
+		5064495D20DC62B90026709C /* RNNSideMenuSideOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 5064495B20DC62B90026709C /* RNNSideMenuSideOptions.h */; };
93
+		5064495E20DC62B90026709C /* RNNSideMenuSideOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 5064495C20DC62B90026709C /* RNNSideMenuSideOptions.m */; };
92
 		506A2B1420973DFD00F43A95 /* RNNErrorHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 506A2B1220973DFD00F43A95 /* RNNErrorHandler.h */; };
94
 		506A2B1420973DFD00F43A95 /* RNNErrorHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 506A2B1220973DFD00F43A95 /* RNNErrorHandler.h */; };
93
 		506A2B1520973DFD00F43A95 /* RNNErrorHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 506A2B1320973DFD00F43A95 /* RNNErrorHandler.m */; };
95
 		506A2B1520973DFD00F43A95 /* RNNErrorHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 506A2B1320973DFD00F43A95 /* RNNErrorHandler.m */; };
94
 		50762D08205E96C200E3D18A /* RNNModalAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 50762D06205E96C200E3D18A /* RNNModalAnimation.h */; };
96
 		50762D08205E96C200E3D18A /* RNNModalAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = 50762D06205E96C200E3D18A /* RNNModalAnimation.h */; };
301
 		50570B252061473D006A1B5C /* RNNTitleOptions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNNTitleOptions.m; sourceTree = "<group>"; };
303
 		50570B252061473D006A1B5C /* RNNTitleOptions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNNTitleOptions.m; sourceTree = "<group>"; };
302
 		50570BE82063E09B006A1B5C /* RNNTitleViewHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNNTitleViewHelper.h; sourceTree = "<group>"; };
304
 		50570BE82063E09B006A1B5C /* RNNTitleViewHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNNTitleViewHelper.h; sourceTree = "<group>"; };
303
 		50570BE92063E09B006A1B5C /* RNNTitleViewHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNNTitleViewHelper.m; sourceTree = "<group>"; };
305
 		50570BE92063E09B006A1B5C /* RNNTitleViewHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNNTitleViewHelper.m; sourceTree = "<group>"; };
306
+		5064495B20DC62B90026709C /* RNNSideMenuSideOptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNNSideMenuSideOptions.h; sourceTree = "<group>"; };
307
+		5064495C20DC62B90026709C /* RNNSideMenuSideOptions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNNSideMenuSideOptions.m; sourceTree = "<group>"; };
304
 		506A2B1220973DFD00F43A95 /* RNNErrorHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNNErrorHandler.h; sourceTree = "<group>"; };
308
 		506A2B1220973DFD00F43A95 /* RNNErrorHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNNErrorHandler.h; sourceTree = "<group>"; };
305
 		506A2B1320973DFD00F43A95 /* RNNErrorHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNNErrorHandler.m; sourceTree = "<group>"; };
309
 		506A2B1320973DFD00F43A95 /* RNNErrorHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNNErrorHandler.m; sourceTree = "<group>"; };
306
 		50762D06205E96C200E3D18A /* RNNModalAnimation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNNModalAnimation.h; sourceTree = "<group>"; };
310
 		50762D06205E96C200E3D18A /* RNNModalAnimation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNNModalAnimation.h; sourceTree = "<group>"; };
564
 				504AFE731FFFF0540076E904 /* RNNTopTabsOptions.m */,
568
 				504AFE731FFFF0540076E904 /* RNNTopTabsOptions.m */,
565
 				50CB3B671FDE911400AA153B /* RNNSideMenuOptions.h */,
569
 				50CB3B671FDE911400AA153B /* RNNSideMenuOptions.h */,
566
 				50CB3B681FDE911400AA153B /* RNNSideMenuOptions.m */,
570
 				50CB3B681FDE911400AA153B /* RNNSideMenuOptions.m */,
571
+				5064495B20DC62B90026709C /* RNNSideMenuSideOptions.h */,
572
+				5064495C20DC62B90026709C /* RNNSideMenuSideOptions.m */,
567
 				50A00C35200F84D6000F01A6 /* RNNOverlayOptions.h */,
573
 				50A00C35200F84D6000F01A6 /* RNNOverlayOptions.h */,
568
 				50A00C36200F84D6000F01A6 /* RNNOverlayOptions.m */,
574
 				50A00C36200F84D6000F01A6 /* RNNOverlayOptions.m */,
569
 				507E7D55201DDD3000444E6C /* RNNAnimationOptions.h */,
575
 				507E7D55201DDD3000444E6C /* RNNAnimationOptions.h */,
802
 				50A00C37200F84D6000F01A6 /* RNNOverlayOptions.h in Headers */,
808
 				50A00C37200F84D6000F01A6 /* RNNOverlayOptions.h in Headers */,
803
 				7B4928081E70415400555040 /* RNNCommandsHandler.h in Headers */,
809
 				7B4928081E70415400555040 /* RNNCommandsHandler.h in Headers */,
804
 				263905AE1E4C6F440023D7D3 /* MMDrawerBarButtonItem.h in Headers */,
810
 				263905AE1E4C6F440023D7D3 /* MMDrawerBarButtonItem.h in Headers */,
811
+				5064495D20DC62B90026709C /* RNNSideMenuSideOptions.h in Headers */,
805
 				50F5DFC11F407A8C001A00BC /* RNNTabBarController.h in Headers */,
812
 				50F5DFC11F407A8C001A00BC /* RNNTabBarController.h in Headers */,
806
 				50CB3B691FDE911400AA153B /* RNNSideMenuOptions.h in Headers */,
813
 				50CB3B691FDE911400AA153B /* RNNSideMenuOptions.h in Headers */,
807
 				263905BD1E4C6F440023D7D3 /* RCCDrawerProtocol.h in Headers */,
814
 				263905BD1E4C6F440023D7D3 /* RCCDrawerProtocol.h in Headers */,
1022
 				50EB4ED82068EBE000D6ED34 /* RNNBackgroundOptions.m in Sources */,
1029
 				50EB4ED82068EBE000D6ED34 /* RNNBackgroundOptions.m in Sources */,
1023
 				507F43CA1FF4F9CC00D9425B /* RNNTopTabOptions.m in Sources */,
1030
 				507F43CA1FF4F9CC00D9425B /* RNNTopTabOptions.m in Sources */,
1024
 				26916C991E4B9E7700D13680 /* RNNReactRootViewCreator.m in Sources */,
1031
 				26916C991E4B9E7700D13680 /* RNNReactRootViewCreator.m in Sources */,
1032
+				5064495E20DC62B90026709C /* RNNSideMenuSideOptions.m in Sources */,
1025
 				214545251F4DC125006E8DA1 /* RNNUIBarButtonItem.m in Sources */,
1033
 				214545251F4DC125006E8DA1 /* RNNUIBarButtonItem.m in Sources */,
1026
 				263905B81E4C6F440023D7D3 /* UIViewController+MMDrawerController.m in Sources */,
1034
 				263905B81E4C6F440023D7D3 /* UIViewController+MMDrawerController.m in Sources */,
1027
 				263905CD1E4C6F440023D7D3 /* SidebarWunderlistAnimation.m in Sources */,
1035
 				263905CD1E4C6F440023D7D3 /* SidebarWunderlistAnimation.m in Sources */,