1 // Copyright 2015-present 650 Industries. All rights reserved. 2 3 import Foundation 4 5 class DevMenuPackagerConnectionHandler { 6 weak var manager: DevMenuManager? 7 8 init(manager: DevMenuManager) { 9 self.manager = manager 10 } 11 setupnull12 func setup() { 13 // `RCT_DEV` isn't available in Swift, that's why we used `DEBUG` instead. 14 // It shouldn't diverge, because of the definition of `RCT_DEV`. 15 #if DEBUG 16 RCTPackagerConnection 17 .shared() 18 .addNotificationHandler( 19 self.sendDevCommandNotificationHandler, 20 queue: DispatchQueue.main, 21 forMethod: "sendDevCommand" 22 ) 23 24 RCTPackagerConnection 25 .shared() 26 .addNotificationHandler( 27 self.devMenuNotificationHanlder, 28 queue: DispatchQueue.main, 29 forMethod: "devMenu" 30 ) 31 #endif 32 } 33 34 @objc sendDevCommandNotificationHandlernull35 func sendDevCommandNotificationHandler(_ params: [String: Any]) { 36 guard let manager = manager, 37 let command = params["name"] as? String, 38 let bridge = manager.currentBridge 39 else { 40 return 41 } 42 43 let devDelegate = DevMenuDevOptionsDelegate(forBridge: bridge) 44 45 switch command { 46 case "reload": 47 devDelegate.reload() 48 case "toggleDevMenu": 49 self.manager?.toggleMenu() 50 case "toggleRemoteDebugging": 51 devDelegate.toggleRemoteDebugging() 52 case "toggleElementInspector": 53 devDelegate.toggleElementInsector() 54 case "togglePerformanceMonitor": 55 devDelegate.togglePerformanceMonitor() 56 case "reconnectReactDevTools": 57 // Emit the `RCTDevMenuShown` for the app to reconnect react-devtools 58 // https://github.com/facebook/react-native/blob/22ba1e45c52edcc345552339c238c1f5ef6dfc65/Libraries/Core/setUpReactDevTools.js#L80 59 bridge.enqueueJSCall("RCTNativeAppEventEmitter.emit", args: ["RCTDevMenuShown"]) 60 default: 61 NSLog("Unknown command from packager: %@", command) 62 } 63 } 64 65 @objc devMenuNotificationHanldernull66 func devMenuNotificationHanlder(_ parames: [String: Any]) { 67 self.manager?.toggleMenu() 68 } 69 } 70