1 // Copyright 2015-present 650 Industries. All rights reserved.
2 
3 import React
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     DevMenuManager.shared.hideMenu()
40 
41     DispatchQueue.main.async {
42       devSettings.isDebuggingRemotely = !devSettings.isDebuggingRemotely
43       (DevMenuManager.shared.window?.rootViewController as? DevMenuViewController)?.updateProps() // We have to force props to reflect changes on the UI
44     }
45   }
46 
47   internal func togglePerformanceMonitor() {
48     #if DEBUG
49     guard let perfMonitor = perfMonitor else {
50       return
51     }
52 
53     guard let devSettings = devSettings else {
54       return
55     }
56 
57     DispatchQueue.main.async {
58       devSettings.isPerfMonitorShown ? perfMonitor.hide() : perfMonitor.show()
59       devSettings.isPerfMonitorShown = !devSettings.isPerfMonitorShown
60     }
61     #endif
62   }
63 
64   internal func toggleFastRefresh() {
65     guard let devSettings = devSettings else {
66       return
67     }
68 
69     devSettings.isHotLoadingEnabled = !devSettings.isHotLoadingEnabled
70   }
71 }
72