1 // Copyright 2015-present 650 Industries. All rights reserved.
2 
3 import Foundation
4 
5 class DevMenuDevOptionsDelegate {
6   internal private(set) weak var bridge: RCTBridge?
7   internal private(set) weak var devSettings: RCTDevSettings?
8 
9   #if DEBUG
10   internal private(set) weak var perfMonitor: RCTPerfMonitor?
11   #endif
12 
13   internal init(forBridge bridge: RCTBridge) {
14     self.bridge = bridge
15     devSettings = bridge.module(forName: "DevSettings") as? RCTDevSettings
16 
17     #if DEBUG
18     perfMonitor = bridge.module(forName: "PerfMonitor") as? RCTPerfMonitor
19     #endif
20   }
21 
22   internal func reload() {
23     // Without this the `expo-splash-screen` will reject
24     // No native splash screen registered for given view controller. Call 'SplashScreen.show' for given view controller first.
25     DevMenuManager.shared.hideMenu();
26 
27     bridge?.requestReload()
28   }
29 
30   internal func toggleElementInsector() {
31     devSettings?.toggleElementInspector()
32   }
33 
34   internal func toggleRemoteDebugging() {
35     guard let devSettings = devSettings else {
36       return
37     }
38 
39     DispatchQueue.main.async {
40       devSettings.isDebuggingRemotely = !devSettings.isDebuggingRemotely
41     }
42   }
43 
44   internal func togglePerformanceMonitor() {
45     #if DEBUG
46     guard let perfMonitor = perfMonitor else {
47       return
48     }
49 
50     guard let devSettings = devSettings else {
51       return
52     }
53 
54     DispatchQueue.main.async {
55       devSettings.isPerfMonitorShown ? perfMonitor.hide() : perfMonitor.show()
56       devSettings.isPerfMonitorShown = !devSettings.isPerfMonitorShown
57     }
58     #endif
59   }
60 
61   internal func toggleFastRefresh() {
62     guard let devSettings = devSettings else {
63       return
64     }
65 
66     devSettings.isHotLoadingEnabled = !devSettings.isHotLoadingEnabled
67   }
68 }
69