119 lines
2.8 KiB
Swift
119 lines
2.8 KiB
Swift
// Copyright 2015-present 650 Industries. All rights reserved.
|
|
|
|
import UIKit
|
|
import React
|
|
import EXDevMenuInterface
|
|
|
|
class DevMenuKeyCommandsInterceptor {
|
|
/**
|
|
Returns bool value whether the dev menu key commands are being intercepted.
|
|
*/
|
|
static var isInstalled: Bool = false {
|
|
willSet {
|
|
if isInstalled != newValue {
|
|
if newValue {
|
|
registerKeyCommands()
|
|
} else {
|
|
unregisterKeyCommands()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static private var moduleObserver: NSObjectProtocol?
|
|
|
|
static private func registerKeyCommands() {
|
|
addModuleObserver()
|
|
|
|
guard let commands = RCTKeyCommands.sharedInstance() else {
|
|
return
|
|
}
|
|
|
|
commands.registerKeyCommand(
|
|
withInput: "d",
|
|
modifierFlags: .command,
|
|
action: { _ in DevMenuManager.shared.toggleMenu() }
|
|
)
|
|
|
|
commands.registerKeyCommand(
|
|
withInput: "d",
|
|
modifierFlags: .control,
|
|
action: { _ in DevMenuManager.shared.toggleMenu() }
|
|
)
|
|
|
|
commands.registerKeyCommand(
|
|
withInput: "r",
|
|
modifierFlags: [],
|
|
action: { _ in
|
|
DevMenuManager.shared.reload()
|
|
}
|
|
)
|
|
|
|
commands.registerKeyCommand(
|
|
withInput: "i",
|
|
modifierFlags: .command,
|
|
action: { _ in
|
|
DevMenuManager.shared.toggleInspector()
|
|
}
|
|
)
|
|
|
|
commands.registerKeyCommand(
|
|
withInput: "p",
|
|
modifierFlags: .command,
|
|
action: { _ in
|
|
DevMenuManager.shared.togglePerformanceMonitor()
|
|
}
|
|
)
|
|
}
|
|
|
|
static private func unregisterKeyCommands() {
|
|
guard let commands = RCTKeyCommands.sharedInstance() else {
|
|
return
|
|
}
|
|
|
|
commands.unregisterKeyCommand(withInput: "d", modifierFlags: .command)
|
|
commands.unregisterKeyCommand(withInput: "d", modifierFlags: .control)
|
|
commands.unregisterKeyCommand(withInput: "r", modifierFlags: [])
|
|
commands.unregisterKeyCommand(withInput: "r", modifierFlags: .command)
|
|
commands.unregisterKeyCommand(withInput: "i", modifierFlags: .command)
|
|
commands.unregisterKeyCommand(withInput: "p", modifierFlags: .command)
|
|
|
|
removeModuleObserver()
|
|
}
|
|
|
|
static private func refreshKeyCommands() {
|
|
guard isInstalled else {
|
|
return
|
|
}
|
|
|
|
RCTExecuteOnMainQueue {
|
|
unregisterKeyCommands()
|
|
registerKeyCommands()
|
|
}
|
|
}
|
|
|
|
static private func addModuleObserver() {
|
|
guard moduleObserver == nil else {
|
|
return
|
|
}
|
|
|
|
moduleObserver = NotificationCenter.default.addObserver(
|
|
forName: NSNotification.Name.RCTDidInitializeModule,
|
|
object: nil,
|
|
queue: .main
|
|
) { notification in
|
|
if (notification.userInfo?["module"] as? RCTDevMenu) != nil {
|
|
refreshKeyCommands()
|
|
}
|
|
}
|
|
}
|
|
|
|
static private func removeModuleObserver() {
|
|
let center = NotificationCenter.default
|
|
if let moduleObserver {
|
|
center.removeObserver(moduleObserver)
|
|
self.moduleObserver = nil
|
|
}
|
|
}
|
|
}
|