1// Copyright 2015-present 650 Industries. All rights reserved.
2
3#import "EXEnvironment.h"
4#import "EXKernel.h"
5#import "EXViewController.h"
6#import "ExpoKit.h"
7#import "EXUtil.h"
8
9@interface EXViewController ()
10
11@end
12
13@implementation EXViewController
14
15- (void)viewDidLoad
16{
17  [super viewDidLoad];
18  self.view.backgroundColor = [UIColor whiteColor];
19  [self createRootAppAndMakeVisible];
20}
21
22- (void)viewWillLayoutSubviews
23{
24  [super viewWillLayoutSubviews];
25  if (_contentViewController) {
26    _contentViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
27  }
28}
29
30- (UIRectEdge)edgesForExtendedLayout
31{
32  return UIRectEdgeNone;
33}
34
35- (BOOL)extendedLayoutIncludesOpaqueBars
36{
37  return YES;
38}
39
40- (void)createRootAppAndMakeVisible
41{
42  NSURL *standaloneAppUrl = [NSURL URLWithString:[EXEnvironment sharedEnvironment].standaloneManifestUrl];
43  NSDictionary *initialProps = [[EXKernel sharedInstance] initialAppPropsFromLaunchOptions:[ExpoKit sharedInstance].launchOptions];
44  EXKernelAppRecord *appRecord = [[EXKernel sharedInstance] createNewAppWithUrl:standaloneAppUrl
45                                                                   initialProps:initialProps];
46
47  UIViewController *viewControllerToShow = (UIViewController *)appRecord.viewController;
48
49  [viewControllerToShow willMoveToParentViewController:self];
50  [self.view addSubview:viewControllerToShow.view];
51  [viewControllerToShow didMoveToParentViewController:self];
52
53  _contentViewController = viewControllerToShow;
54  [self.view setNeedsLayout];
55  if (_delegate) {
56    [_delegate viewController:self didNavigateAppToVisible:appRecord];
57  }
58}
59
60- (BOOL)shouldAutorotate
61{
62  return YES;
63}
64
65- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^_Nullable)(void))completion
66{
67  // @tsapeta: some RN's modules try to present modal view controllers on EXRootViewController
68  // but for the correct behavior they should be presented on the innermost controller in EXAppViewController hierarchy,
69  // so we just pass this call to the current controller.
70  if ([viewControllerToPresent isKindOfClass:[UIAlertController class]]
71      || [viewControllerToPresent isKindOfClass:[UIDocumentMenuViewController class]]
72//      || [viewControllerToPresent isKindOfClass:[UIImagePickerController class]] // ImagePicker invoked from WebView with this specific logic makes AppController holding WebView to be dismissed
73      || [viewControllerToPresent isKindOfClass:[UIActivityViewController class]]
74  ) {
75    [[[ExpoKit sharedInstance] currentViewController] presentViewController:viewControllerToPresent animated:flag completion:completion];
76  } else {
77    [super presentViewController:viewControllerToPresent animated:flag completion:completion];
78  }
79}
80
81@end
82