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