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