Browse Source

add container store in order to support push

Ran Greenberg 7 years ago
parent
commit
454bc30dac

+ 2
- 0
ios/RNN.h View File

4
 
4
 
5
 #import "RNNEventEmitter.h"
5
 #import "RNNEventEmitter.h"
6
 #import "RCTBridge.h"
6
 #import "RCTBridge.h"
7
+#import "RNNStore.h"
7
 
8
 
8
 @interface RNN : NSObject
9
 @interface RNN : NSObject
9
 
10
 
10
 @property (readonly) BOOL isReadyToReceiveCommands;
11
 @property (readonly) BOOL isReadyToReceiveCommands;
11
 @property (readonly) RCTBridge* bridge;
12
 @property (readonly) RCTBridge* bridge;
12
 @property (readonly) RNNEventEmitter* eventEmitter;
13
 @property (readonly) RNNEventEmitter* eventEmitter;
14
+@property (readonly) RNNStore *store;
13
 
15
 
14
 +(instancetype)instance;
16
 +(instancetype)instance;
15
 
17
 

+ 12
- 0
ios/RNN.m View File

11
 @property (readwrite) BOOL isReadyToReceiveCommands;
11
 @property (readwrite) BOOL isReadyToReceiveCommands;
12
 @property (readwrite) RNNEventEmitter* eventEmitter;
12
 @property (readwrite) RNNEventEmitter* eventEmitter;
13
 
13
 
14
+@property (readwrite) RNNStore *store;
15
+
14
 @end
16
 @end
15
 
17
 
16
 @implementation RNN
18
 @implementation RNN
17
 
19
 
20
+
18
 # pragma mark public
21
 # pragma mark public
19
 
22
 
23
+
20
 +(instancetype)instance
24
 +(instancetype)instance
21
 {
25
 {
22
 	static RNN *sharedInstance = nil;
26
 	static RNN *sharedInstance = nil;
31
 	return sharedInstance;
35
 	return sharedInstance;
32
 }
36
 }
33
 
37
 
38
+
34
 -(void)bootstrap:(NSURL *)jsCodeLocation launchOptions:(NSDictionary *)launchOptions
39
 -(void)bootstrap:(NSURL *)jsCodeLocation launchOptions:(NSDictionary *)launchOptions
35
 {
40
 {
36
 	self.eventEmitter = [RNNEventEmitter new];
41
 	self.eventEmitter = [RNNEventEmitter new];
37
 	
42
 	
43
+	self.store = [RNNStore new];
44
+	
38
 	UIApplication.sharedApplication.delegate.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
45
 	UIApplication.sharedApplication.delegate.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
39
 	UIApplication.sharedApplication.delegate.window.backgroundColor = [UIColor whiteColor];
46
 	UIApplication.sharedApplication.delegate.window.backgroundColor = [UIColor whiteColor];
40
 	
47
 	
45
 	self.bridge = [[RCTBridge alloc] initWithBundleURL:jsCodeLocation moduleProvider:nil launchOptions:launchOptions];
52
 	self.bridge = [[RCTBridge alloc] initWithBundleURL:jsCodeLocation moduleProvider:nil launchOptions:launchOptions];
46
 }
53
 }
47
 
54
 
55
+
48
 # pragma mark private
56
 # pragma mark private
49
 
57
 
58
+
50
 -(void)registerForJsEvents
59
 -(void)registerForJsEvents
51
 {
60
 {
52
 	[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onJavaScriptLoaded) name:RCTJavaScriptDidLoadNotification object:self.bridge];
61
 	[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onJavaScriptLoaded) name:RCTJavaScriptDidLoadNotification object:self.bridge];
57
 #pragma GCC diagnostic pop
66
 #pragma GCC diagnostic pop
58
 }
67
 }
59
 
68
 
69
+
60
 -(void)onJavaScriptLoaded
70
 -(void)onJavaScriptLoaded
61
 {
71
 {
62
 	self.isReadyToReceiveCommands = true;
72
 	self.isReadyToReceiveCommands = true;
63
 	[self.eventEmitter sendOnAppLaunched];
73
 	[self.eventEmitter sendOnAppLaunched];
64
 }
74
 }
65
 
75
 
76
+
66
 -(void)onJavaScriptDevReload
77
 -(void)onJavaScriptDevReload
67
 {
78
 {
68
 	UIApplication.sharedApplication.delegate.window.rootViewController = nil;
79
 	UIApplication.sharedApplication.delegate.window.rootViewController = nil;
69
 }
80
 }
70
 
81
 
82
+
71
 @end
83
 @end

+ 7
- 3
ios/RNNBridgeModule.m View File

3
 #import "RNN.h"
3
 #import "RNN.h"
4
 #import "RNNControllerFactory.h"
4
 #import "RNNControllerFactory.h"
5
 #import "RNNReactRootViewCreator.h"
5
 #import "RNNReactRootViewCreator.h"
6
+#import "RNNStore.h"
6
 
7
 
7
 @implementation RNNBridgeModule
8
 @implementation RNNBridgeModule
8
 
9
 
16
 RCT_EXPORT_METHOD(setRoot:(NSDictionary*)layout)
17
 RCT_EXPORT_METHOD(setRoot:(NSDictionary*)layout)
17
 {
18
 {
18
 	[self assertReady];
19
 	[self assertReady];
19
-	RNNControllerFactory *factory = [[RNNControllerFactory alloc] initWithRootViewCreator:[RNNReactRootViewCreator new]];
20
+	RNNControllerFactory *factory = [[RNNControllerFactory alloc] initWithRootViewCreator:[RNNReactRootViewCreator new] store:[RNN instance].store];
20
 	UIViewController *vc = [factory createLayout:layout];
21
 	UIViewController *vc = [factory createLayout:layout];
22
+	
21
 	UIApplication.sharedApplication.delegate.window.rootViewController = vc;
23
 	UIApplication.sharedApplication.delegate.window.rootViewController = vc;
22
 	[UIApplication.sharedApplication.delegate.window makeKeyAndVisible];
24
 	[UIApplication.sharedApplication.delegate.window makeKeyAndVisible];
23
 }
25
 }
26
 {
28
 {
27
 	[self assertReady];
29
 	[self assertReady];
28
 	//TODO implement correctly
30
 	//TODO implement correctly
29
-	RNNControllerFactory *factory = [[RNNControllerFactory alloc] initWithRootViewCreator:[RNNReactRootViewCreator new]];
31
+	RNNControllerFactory *factory = [[RNNControllerFactory alloc] initWithRootViewCreator:[RNNReactRootViewCreator new] store:[RNN instance].store];
30
 	UIViewController *newVc = [factory createLayout:layout];
32
 	UIViewController *newVc = [factory createLayout:layout];
31
-	id vc = [UIApplication.sharedApplication.delegate.window.rootViewController childViewControllers][0];
33
+	
34
+	id vc = [[RNN instance].store findContainerForId:containerId];
35
+	
32
 	[[vc navigationController]pushViewController:newVc animated:true];
36
 	[[vc navigationController]pushViewController:newVc animated:true];
33
 }
37
 }
34
 
38
 

+ 2
- 1
ios/RNNControllerFactory.h View File

5
 #import "RNNRootViewController.h"
5
 #import "RNNRootViewController.h"
6
 #import "RNNSideMenuController.h"
6
 #import "RNNSideMenuController.h"
7
 #import "RNNSideMenuChildVC.h"
7
 #import "RNNSideMenuChildVC.h"
8
+#import "RNNStore.h"
8
 
9
 
9
 @interface RNNControllerFactory : NSObject
10
 @interface RNNControllerFactory : NSObject
10
 
11
 
11
--(instancetype)initWithRootViewCreator:(id <RNNRootViewCreator>)creator;
12
+-(instancetype)initWithRootViewCreator:(id <RNNRootViewCreator>)creator store:(RNNStore*)store;
12
 
13
 
13
 -(UIViewController*)createLayout:(NSDictionary*)layout;
14
 -(UIViewController*)createLayout:(NSDictionary*)layout;
14
 
15
 

+ 20
- 11
ios/RNNControllerFactory.m View File

7
 @interface RNNControllerFactory ()
7
 @interface RNNControllerFactory ()
8
 
8
 
9
 @property (nonatomic, strong) id<RNNRootViewCreator> creator;
9
 @property (nonatomic, strong) id<RNNRootViewCreator> creator;
10
+@property (nonatomic, strong) RNNStore *store;
10
 
11
 
11
 @end
12
 @end
12
 
13
 
15
 # pragma mark public
16
 # pragma mark public
16
 
17
 
17
 
18
 
18
--(instancetype)initWithRootViewCreator:(id <RNNRootViewCreator>)creator {
19
+-(instancetype)initWithRootViewCreator:(id <RNNRootViewCreator>)creator store:(RNNStore *)store {
19
 	
20
 	
20
 	self = [super init];
21
 	self = [super init];
21
 	self.creator = creator;
22
 	self.creator = creator;
23
+	self.store = store;
22
 	
24
 	
23
 	return self;
25
 	return self;
24
 }
26
 }
34
 {
36
 {
35
 	RNNLayoutNode* node = [RNNLayoutNode create:json];
37
 	RNNLayoutNode* node = [RNNLayoutNode create:json];
36
 	
38
 	
39
+	UIViewController* result;
40
+	
37
 	if ( node.isContainer) {
41
 	if ( node.isContainer) {
38
-		
39
-		return [self createContainer:node];
42
+		result = [self createContainer:node];
40
 	}
43
 	}
41
 	
44
 	
42
 	else if (node.isContainerStack)	{
45
 	else if (node.isContainerStack)	{
43
-		return [self createContainerStack:node];
46
+		result = [self createContainerStack:node];
44
 	}
47
 	}
45
 	
48
 	
46
 	else if (node.isTabs) {
49
 	else if (node.isTabs) {
47
-		return [self createTabs:node];
50
+		result = [self createTabs:node];
48
 	}
51
 	}
49
 	
52
 	
50
 	else if (node.isSideMenuRoot) {
53
 	else if (node.isSideMenuRoot) {
51
-		return [self createSideMenu:node];
54
+		result = [self createSideMenu:node];
52
 	}
55
 	}
53
 	
56
 	
54
 	else if (node.isSideMenuCenter) {
57
 	else if (node.isSideMenuCenter) {
55
-		return [self createSideMenuChild:node type:RNNSideMenuChildTypeCenter];
58
+		result = [self createSideMenuChild:node type:RNNSideMenuChildTypeCenter];
56
 	}
59
 	}
57
 	
60
 	
58
 	else if (node.isSideMenuLeft) {
61
 	else if (node.isSideMenuLeft) {
59
-		return [self createSideMenuChild:node type:RNNSideMenuChildTypeLeft];
62
+		result = [self createSideMenuChild:node type:RNNSideMenuChildTypeLeft];
60
 	}
63
 	}
61
 	else if (node.isSideMenuRight) {
64
 	else if (node.isSideMenuRight) {
62
-		return [self createSideMenuChild:node type:RNNSideMenuChildTypeRight];
65
+		result = [self createSideMenuChild:node type:RNNSideMenuChildTypeRight];
66
+	}
67
+	
68
+	if (!result) {
69
+		@throw [NSException exceptionWithName:@"UnknownControllerType" reason:[@"Unknown controller type " stringByAppendingString:node.type] userInfo:nil];
63
 	}
70
 	}
71
+
72
+	[self.store setContainer:result containerId:node.nodeId];
64
 	
73
 	
65
-	@throw [NSException exceptionWithName:@"UnknownControllerType" reason:[@"Unknown controller type " stringByAppendingString:node.type] userInfo:nil];
74
+	return result;
66
 }
75
 }
67
 
76
 
68
 -(RNNRootViewController*)createContainer:(RNNLayoutNode*)node
77
 -(RNNRootViewController*)createContainer:(RNNLayoutNode*)node
101
 }
110
 }
102
 
111
 
103
 -(UIViewController*)createSideMenu:(RNNLayoutNode*)node
112
 -(UIViewController*)createSideMenu:(RNNLayoutNode*)node
104
-{	
113
+{
105
 	NSMutableArray* childrenVCs = [NSMutableArray new];
114
 	NSMutableArray* childrenVCs = [NSMutableArray new];
106
 	
115
 	
107
 	
116
 	

+ 18
- 0
ios/RNNStore.h View File

1
+//
2
+//  RNNStore.h
3
+//  ReactNativeNavigation
4
+//
5
+//  Created by Ran Greenberg on 12/02/2017.
6
+//  Copyright © 2017 Wix. All rights reserved.
7
+//
8
+
9
+#import <Foundation/Foundation.h>
10
+#import <UIKit/UIKit.h>
11
+
12
+
13
+@interface RNNStore : NSObject
14
+
15
+- (UIViewController*)findContainerForId:(NSString*)containerId;
16
+- (void)setContainer:(UIViewController*)viewController containerId:(NSString*)containerId;
17
+
18
+@end

+ 46
- 0
ios/RNNStore.m View File

1
+//
2
+//  RNNStore.m
3
+//  ReactNativeNavigation
4
+//
5
+//  Created by Ran Greenberg on 12/02/2017.
6
+//  Copyright © 2017 Wix. All rights reserved.
7
+//
8
+
9
+#import "RNNStore.h"
10
+
11
+@interface RNNStore ()
12
+
13
+@property NSMutableDictionary *containerStore;
14
+
15
+@end
16
+
17
+@implementation RNNStore
18
+
19
+
20
+-(instancetype)init {
21
+	self = [super init];
22
+	self.containerStore = [NSMutableDictionary new];
23
+	
24
+	return self;
25
+}
26
+
27
+
28
+-(UIViewController *)findContainerForId:(NSString *)containerId {
29
+	return [self.containerStore valueForKey:containerId];
30
+}
31
+
32
+
33
+- (void)setContainer:(UIViewController*)viewController containerId:(NSString*)containerId {
34
+	if (!containerId) {
35
+		return;
36
+	}
37
+	
38
+	UIViewController *existingVewController = [self findContainerForId:containerId];
39
+	if (existingVewController) {
40
+		@throw [NSException exceptionWithName:@"MultipleContainerId" reason:[@"Container id already exists " stringByAppendingString:containerId] userInfo:nil];	}
41
+	
42
+	[self.containerStore setObject:viewController forKey:containerId];
43
+}
44
+
45
+
46
+@end

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

45
 		263905D71E4C94970023D7D3 /* RNNSideMenuController.m in Sources */ = {isa = PBXBuildFile; fileRef = 263905D51E4C94970023D7D3 /* RNNSideMenuController.m */; };
45
 		263905D71E4C94970023D7D3 /* RNNSideMenuController.m in Sources */ = {isa = PBXBuildFile; fileRef = 263905D51E4C94970023D7D3 /* RNNSideMenuController.m */; };
46
 		263905E61E4CAC950023D7D3 /* RNNSideMenuChildVC.h in Headers */ = {isa = PBXBuildFile; fileRef = 263905E41E4CAC950023D7D3 /* RNNSideMenuChildVC.h */; };
46
 		263905E61E4CAC950023D7D3 /* RNNSideMenuChildVC.h in Headers */ = {isa = PBXBuildFile; fileRef = 263905E41E4CAC950023D7D3 /* RNNSideMenuChildVC.h */; };
47
 		263905E71E4CAC950023D7D3 /* RNNSideMenuChildVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 263905E51E4CAC950023D7D3 /* RNNSideMenuChildVC.m */; };
47
 		263905E71E4CAC950023D7D3 /* RNNSideMenuChildVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 263905E51E4CAC950023D7D3 /* RNNSideMenuChildVC.m */; };
48
+		268692821E5054F800E2C612 /* RNNStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 268692801E5054F800E2C612 /* RNNStore.h */; };
49
+		268692831E5054F800E2C612 /* RNNStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 268692811E5054F800E2C612 /* RNNStore.m */; };
48
 		26916C981E4B9E7700D13680 /* RNNReactRootViewCreator.h in Headers */ = {isa = PBXBuildFile; fileRef = 26916C961E4B9E7700D13680 /* RNNReactRootViewCreator.h */; };
50
 		26916C981E4B9E7700D13680 /* RNNReactRootViewCreator.h in Headers */ = {isa = PBXBuildFile; fileRef = 26916C961E4B9E7700D13680 /* RNNReactRootViewCreator.h */; };
49
 		26916C991E4B9E7700D13680 /* RNNReactRootViewCreator.m in Sources */ = {isa = PBXBuildFile; fileRef = 26916C971E4B9E7700D13680 /* RNNReactRootViewCreator.m */; };
51
 		26916C991E4B9E7700D13680 /* RNNReactRootViewCreator.m in Sources */ = {isa = PBXBuildFile; fileRef = 26916C971E4B9E7700D13680 /* RNNReactRootViewCreator.m */; };
50
 		7B1126A01E2D263F00F9B03B /* RNNEventEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B11269F1E2D263F00F9B03B /* RNNEventEmitter.m */; };
52
 		7B1126A01E2D263F00F9B03B /* RNNEventEmitter.m in Sources */ = {isa = PBXBuildFile; fileRef = 7B11269F1E2D263F00F9B03B /* RNNEventEmitter.m */; };
116
 		263905D51E4C94970023D7D3 /* RNNSideMenuController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNNSideMenuController.m; sourceTree = "<group>"; };
118
 		263905D51E4C94970023D7D3 /* RNNSideMenuController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNNSideMenuController.m; sourceTree = "<group>"; };
117
 		263905E41E4CAC950023D7D3 /* RNNSideMenuChildVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNNSideMenuChildVC.h; sourceTree = "<group>"; };
119
 		263905E41E4CAC950023D7D3 /* RNNSideMenuChildVC.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNNSideMenuChildVC.h; sourceTree = "<group>"; };
118
 		263905E51E4CAC950023D7D3 /* RNNSideMenuChildVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNNSideMenuChildVC.m; sourceTree = "<group>"; };
120
 		263905E51E4CAC950023D7D3 /* RNNSideMenuChildVC.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNNSideMenuChildVC.m; sourceTree = "<group>"; };
121
+		268692801E5054F800E2C612 /* RNNStore.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNNStore.h; sourceTree = "<group>"; };
122
+		268692811E5054F800E2C612 /* RNNStore.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNNStore.m; sourceTree = "<group>"; };
119
 		26916C941E4B9CCC00D13680 /* RNNRootViewCreator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNNRootViewCreator.h; sourceTree = "<group>"; };
123
 		26916C941E4B9CCC00D13680 /* RNNRootViewCreator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNNRootViewCreator.h; sourceTree = "<group>"; };
120
 		26916C961E4B9E7700D13680 /* RNNReactRootViewCreator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNNReactRootViewCreator.h; sourceTree = "<group>"; };
124
 		26916C961E4B9E7700D13680 /* RNNReactRootViewCreator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNNReactRootViewCreator.h; sourceTree = "<group>"; };
121
 		26916C971E4B9E7700D13680 /* RNNReactRootViewCreator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNNReactRootViewCreator.m; sourceTree = "<group>"; };
125
 		26916C971E4B9E7700D13680 /* RNNReactRootViewCreator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNNReactRootViewCreator.m; sourceTree = "<group>"; };
232
 				263905D51E4C94970023D7D3 /* RNNSideMenuController.m */,
236
 				263905D51E4C94970023D7D3 /* RNNSideMenuController.m */,
233
 				263905E41E4CAC950023D7D3 /* RNNSideMenuChildVC.h */,
237
 				263905E41E4CAC950023D7D3 /* RNNSideMenuChildVC.h */,
234
 				263905E51E4CAC950023D7D3 /* RNNSideMenuChildVC.m */,
238
 				263905E51E4CAC950023D7D3 /* RNNSideMenuChildVC.m */,
239
+				268692801E5054F800E2C612 /* RNNStore.h */,
240
+				268692811E5054F800E2C612 /* RNNStore.m */,
235
 			);
241
 			);
236
 			name = Controllers;
242
 			name = Controllers;
237
 			sourceTree = "<group>";
243
 			sourceTree = "<group>";
300
 				263905BE1E4C6F440023D7D3 /* RCCTheSideBarManagerViewController.h in Headers */,
306
 				263905BE1E4C6F440023D7D3 /* RCCTheSideBarManagerViewController.h in Headers */,
301
 				263905CE1E4C6F440023D7D3 /* TheSidebarController.h in Headers */,
307
 				263905CE1E4C6F440023D7D3 /* TheSidebarController.h in Headers */,
302
 				7B1126A71E2D2B6C00F9B03B /* RNNEventEmitter.h in Headers */,
308
 				7B1126A71E2D2B6C00F9B03B /* RNNEventEmitter.h in Headers */,
309
+				268692821E5054F800E2C612 /* RNNStore.h in Headers */,
303
 				263905CA1E4C6F440023D7D3 /* SidebarLuvocracyAnimation.h in Headers */,
310
 				263905CA1E4C6F440023D7D3 /* SidebarLuvocracyAnimation.h in Headers */,
304
 				263905B11E4C6F440023D7D3 /* MMDrawerController.h in Headers */,
311
 				263905B11E4C6F440023D7D3 /* MMDrawerController.h in Headers */,
305
 				263905B91E4C6F440023D7D3 /* RCCDrawerController.h in Headers */,
312
 				263905B91E4C6F440023D7D3 /* RCCDrawerController.h in Headers */,
392
 				263905CF1E4C6F440023D7D3 /* TheSidebarController.m in Sources */,
399
 				263905CF1E4C6F440023D7D3 /* TheSidebarController.m in Sources */,
393
 				263905AF1E4C6F440023D7D3 /* MMDrawerBarButtonItem.m in Sources */,
400
 				263905AF1E4C6F440023D7D3 /* MMDrawerBarButtonItem.m in Sources */,
394
 				7BBFE5611E253F97002A6182 /* RNN.m in Sources */,
401
 				7BBFE5611E253F97002A6182 /* RNN.m in Sources */,
402
+				268692831E5054F800E2C612 /* RNNStore.m in Sources */,
395
 				7BC9346E1E26886E00EFA125 /* RNNControllerFactory.m in Sources */,
403
 				7BC9346E1E26886E00EFA125 /* RNNControllerFactory.m in Sources */,
396
 				263905B61E4C6F440023D7D3 /* MMExampleDrawerVisualStateManager.m in Sources */,
404
 				263905B61E4C6F440023D7D3 /* MMExampleDrawerVisualStateManager.m in Sources */,
397
 				263905C91E4C6F440023D7D3 /* SidebarFlipboardAnimation.m in Sources */,
405
 				263905C91E4C6F440023D7D3 /* SidebarFlipboardAnimation.m in Sources */,

+ 4
- 0
playground/ios/playground.xcodeproj/project.pbxproj View File

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
 		2647D65F1DB175C200B23722 /* libReactNativeNavigation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2647D65E1DB175B300B23722 /* libReactNativeNavigation.a */; };
24
 		2647D65F1DB175C200B23722 /* libReactNativeNavigation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2647D65E1DB175B300B23722 /* libReactNativeNavigation.a */; };
25
+		268692851E50572700E2C612 /* RNNStoreTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 268692841E50572700E2C612 /* RNNStoreTest.m */; };
25
 		7B9B39861DEB4091004A6281 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B9B39631DEB4076004A6281 /* libRCTAnimation.a */; };
26
 		7B9B39861DEB4091004A6281 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B9B39631DEB4076004A6281 /* libRCTAnimation.a */; };
26
 		7BD721FF1E2E421E00724059 /* libReactNativeNavigation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2647D65E1DB175B300B23722 /* libReactNativeNavigation.a */; };
27
 		7BD721FF1E2E421E00724059 /* libReactNativeNavigation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2647D65E1DB175B300B23722 /* libReactNativeNavigation.a */; };
27
 		832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
28
 		832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
211
 		146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; };
212
 		146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = "<group>"; };
212
 		26070FCF1E4B8B9D003EC8B9 /* RNNControllerFactoryTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNNControllerFactoryTest.m; sourceTree = "<group>"; };
213
 		26070FCF1E4B8B9D003EC8B9 /* RNNControllerFactoryTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNNControllerFactoryTest.m; sourceTree = "<group>"; };
213
 		2647D6591DB175B300B23722 /* ReactNativeNavigation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ReactNativeNavigation.xcodeproj; path = "../node_modules/react-native-navigation/ios/ReactNativeNavigation.xcodeproj"; sourceTree = "<group>"; };
214
 		2647D6591DB175B300B23722 /* ReactNativeNavigation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ReactNativeNavigation.xcodeproj; path = "../node_modules/react-native-navigation/ios/ReactNativeNavigation.xcodeproj"; sourceTree = "<group>"; };
215
+		268692841E50572700E2C612 /* RNNStoreTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNNStoreTest.m; sourceTree = "<group>"; };
214
 		78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
216
 		78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
215
 		7B9B395C1DEB4076004A6281 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = "<group>"; };
217
 		7B9B395C1DEB4076004A6281 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = "<group>"; };
216
 		832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
218
 		832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
294
 			children = (
296
 			children = (
295
 				26070FCF1E4B8B9D003EC8B9 /* RNNControllerFactoryTest.m */,
297
 				26070FCF1E4B8B9D003EC8B9 /* RNNControllerFactoryTest.m */,
296
 				00E356F01AD99517003FC87E /* Supporting Files */,
298
 				00E356F01AD99517003FC87E /* Supporting Files */,
299
+				268692841E50572700E2C612 /* RNNStoreTest.m */,
297
 			);
300
 			);
298
 			path = playgroundTests;
301
 			path = playgroundTests;
299
 			sourceTree = "<group>";
302
 			sourceTree = "<group>";
734
 			isa = PBXSourcesBuildPhase;
737
 			isa = PBXSourcesBuildPhase;
735
 			buildActionMask = 2147483647;
738
 			buildActionMask = 2147483647;
736
 			files = (
739
 			files = (
740
+				268692851E50572700E2C612 /* RNNStoreTest.m in Sources */,
737
 				26070FD01E4B8B9D003EC8B9 /* RNNControllerFactoryTest.m in Sources */,
741
 				26070FD01E4B8B9D003EC8B9 /* RNNControllerFactoryTest.m in Sources */,
738
 			);
742
 			);
739
 			runOnlyForDeploymentPostprocessing = 0;
743
 			runOnlyForDeploymentPostprocessing = 0;

+ 16
- 3
playground/ios/playgroundTests/RNNControllerFactoryTest.m View File

14
 
14
 
15
 @property (nonatomic, strong) id<RNNRootViewCreator> creator;
15
 @property (nonatomic, strong) id<RNNRootViewCreator> creator;
16
 @property (nonatomic, strong) RNNControllerFactory *factory;
16
 @property (nonatomic, strong) RNNControllerFactory *factory;
17
+@property (nonatomic, strong) RNNStore *store;
17
 
18
 
18
 @end
19
 @end
19
 
20
 
22
 - (void)setUp {
23
 - (void)setUp {
23
 	[super setUp];
24
 	[super setUp];
24
 	self.creator = nil;
25
 	self.creator = nil;
25
-	self.factory = [[RNNControllerFactory alloc] initWithRootViewCreator:self.creator];
26
-	
26
+	self.store = [RNNStore new];
27
+	self.factory = [[RNNControllerFactory alloc] initWithRootViewCreator:self.creator store:self.store];
27
 }
28
 }
28
 
29
 
29
 - (void)tearDown {
30
 - (void)tearDown {
125
 																	   @"type": @"SideMenuRight",
126
 																	   @"type": @"SideMenuRight",
126
 																	   @"data": @{},
127
 																	   @"data": @{},
127
 																	   @"children": @[
128
 																	   @"children": @[
128
-																			   @{@"id": @"cntId_5",
129
+																			   @{@"id": @"cntId_7",
129
 																				 @"type": @"Container",
130
 																				 @"type": @"Container",
130
 																				 @"data": @{},
131
 																				 @"data": @{},
131
 																				 @"children": @[]}]}]}];
132
 																				 @"children": @[]}]}]}];
189
 	
190
 	
190
 }
191
 }
191
 
192
 
193
+- (void)testCreateLayout_addContainerToStore {
194
+	NSString *containerId = @"cntId";
195
+	UIViewController *ans = [self.factory createLayout:
196
+							 @{@"id": containerId,
197
+							   @"type": @"Container",
198
+							   @"data": @{},
199
+							   @"children": @[]}];
200
+	
201
+	UIViewController *storeAns = [self.store findContainerForId:containerId];
202
+	XCTAssertEqualObjects(ans, storeAns);
203
+}
204
+
192
 
205
 
193
 
206
 
194
 @end
207
 @end

+ 67
- 0
playground/ios/playgroundTests/RNNStoreTest.m View File

1
+//
2
+//  RNNStoreTest.m
3
+//  playground
4
+//
5
+//  Created by Ran Greenberg on 12/02/2017.
6
+//  Copyright © 2017 Wix. All rights reserved.
7
+//
8
+
9
+#import <XCTest/XCTest.h>
10
+#import "RNNStore.m"
11
+
12
+@interface RNNStoreTest : XCTestCase
13
+
14
+@property (nonatomic, strong) RNNStore *store;
15
+
16
+@end
17
+
18
+@implementation RNNStoreTest
19
+
20
+- (void)setUp {
21
+    [super setUp];
22
+	
23
+	self.store = [RNNStore new];
24
+}
25
+
26
+
27
+- (void)testFindContainerForId_setAndGetsimpleContainerId {
28
+	NSString *containerId1 = @"cntId1";
29
+	NSString *containerId2 = @"cntId2";
30
+	
31
+	UIViewController *vc1 = [UIViewController new];
32
+	UIViewController *vc2 = [UIViewController new];
33
+	
34
+	[self.store setContainer:vc1 containerId:containerId1];
35
+	[self.store setContainer:vc2 containerId:containerId2];
36
+	
37
+	UIViewController *ans = [self.store findContainerForId:containerId1];
38
+	
39
+	XCTAssertEqualObjects(vc1, ans);
40
+	XCTAssertNotEqualObjects(vc2, ans);
41
+}
42
+
43
+- (void)testFindContainerForId_setNilContainerId {
44
+	NSString *containerId1 = nil;
45
+	UIViewController *vc1 = [UIViewController new];
46
+	[self.store setContainer:vc1 containerId:containerId1];
47
+	
48
+	UIViewController *ans = [self.store findContainerForId:containerId1];
49
+	XCTAssertNil(ans);
50
+}
51
+
52
+- (void)testFindContainerForId_setDoubleContainerId {
53
+	NSString *containerId1 = @"cntId1";
54
+	
55
+	UIViewController *vc1 = [UIViewController new];
56
+	UIViewController *vc2 = [UIViewController new];
57
+	
58
+	[self.store setContainer:vc1 containerId:containerId1];
59
+	
60
+	UIViewController *ans = [self.store findContainerForId:containerId1];
61
+	XCTAssertEqualObjects(vc1, ans);
62
+	XCTAssertThrows([self.store setContainer:vc2 containerId:containerId1]);
63
+}
64
+
65
+
66
+
67
+@end