xref: /expo/ios/Client/Menu/EXDevMenuWindow.m (revision f1012652)
1f67462bcSTomasz Sapeta// Copyright 2015-present 650 Industries. All rights reserved.
2f67462bcSTomasz Sapeta
3f67462bcSTomasz Sapeta#import "EXDevMenuWindow.h"
4f67462bcSTomasz Sapeta#import "EXDevMenuViewController.h"
5f67462bcSTomasz Sapeta#import "EXDevMenuManager.h"
6f67462bcSTomasz Sapeta
7f67462bcSTomasz Sapeta@interface EXDevMenuWindow ()
8f67462bcSTomasz Sapeta
9f67462bcSTomasz Sapeta@property (nonatomic, strong) EXDevMenuViewController *viewController;
10f67462bcSTomasz Sapeta
11f67462bcSTomasz Sapeta@end
12f67462bcSTomasz Sapeta
13f67462bcSTomasz Sapeta@implementation EXDevMenuWindow
14f67462bcSTomasz Sapeta
15f67462bcSTomasz Sapeta#pragma mark - UIWindow
16f67462bcSTomasz Sapeta
17f67462bcSTomasz Sapeta- (instancetype)init
18f67462bcSTomasz Sapeta{
19f67462bcSTomasz Sapeta  if (self = [super init]) {
20*59c8df89SEvan Bacon    // Set it just above the LogBox so users can easily access it.
21*59c8df89SEvan Bacon    // https://github.com/facebook/react-native/blob/0.64-stable/React/CoreModules/RCTLogBoxView.mm#L38
22*59c8df89SEvan Bacon    self.windowLevel = UIWindowLevelStatusBar;
23f67462bcSTomasz Sapeta    self.backgroundColor = [UIColor clearColor];
24f67462bcSTomasz Sapeta    self.hidden = YES;
25f67462bcSTomasz Sapeta  }
26f67462bcSTomasz Sapeta  return self;
27f67462bcSTomasz Sapeta}
28f67462bcSTomasz Sapeta
29f67462bcSTomasz Sapeta- (void)makeKeyAndVisible
30f67462bcSTomasz Sapeta{
31f67462bcSTomasz Sapeta  [super makeKeyAndVisible];
32f67462bcSTomasz Sapeta
33f67462bcSTomasz Sapeta  // `makeKeyAndVisible` apparently doesn't call `hidden` setter so make sure the root view is attached.
34f67462bcSTomasz Sapeta  [self attachRootViewController];
35f67462bcSTomasz Sapeta}
36f67462bcSTomasz Sapeta
37f67462bcSTomasz Sapeta- (void)setHidden:(BOOL)hidden
38f67462bcSTomasz Sapeta{
39f67462bcSTomasz Sapeta  [super setHidden:hidden];
40f67462bcSTomasz Sapeta
41f67462bcSTomasz Sapeta  // Reset `rootViewController` so it gets appearing/disappearing events that we depend on.
42f67462bcSTomasz Sapeta  if (hidden) {
43f67462bcSTomasz Sapeta    [self detachRootViewController];
44f67462bcSTomasz Sapeta  } else {
45f67462bcSTomasz Sapeta    [self attachRootViewController];
46f67462bcSTomasz Sapeta  }
47f67462bcSTomasz Sapeta}
48f67462bcSTomasz Sapeta
49f67462bcSTomasz Sapeta#pragma mark - internal
50f67462bcSTomasz Sapeta
51f67462bcSTomasz Sapeta- (void)attachRootViewController
52f67462bcSTomasz Sapeta{
53f67462bcSTomasz Sapeta  if (!_viewController) {
54f67462bcSTomasz Sapeta    _viewController = [EXDevMenuViewController new];
55f67462bcSTomasz Sapeta  }
56f67462bcSTomasz Sapeta  self.rootViewController = _viewController;
57f67462bcSTomasz Sapeta}
58f67462bcSTomasz Sapeta
59f67462bcSTomasz Sapeta- (void)detachRootViewController
60f67462bcSTomasz Sapeta{
61f67462bcSTomasz Sapeta  self.rootViewController = nil;
62f67462bcSTomasz Sapeta}
63f67462bcSTomasz Sapeta
64f67462bcSTomasz Sapeta@end
65