ssap_app/node_modules/expo-dev-launcher/ios/ReactNative/EXDevLauncherRedBoxIntercep...

70 lines
2.0 KiB
Swift

// Copyright 2015-present 650 Industries. All rights reserved.
import Foundation
@objc
public class EXDevLauncherRedBoxInterceptor: NSObject {
@objc static let customRedBox = EXDevLauncherRedBox()
@objc
public static var isInstalled: Bool = false {
willSet {
if isInstalled != newValue {
swizzle()
}
}
}
static private func swizzle() {
EXDevLauncherUtils.swizzle(
selector: #selector(RCTCxxBridge.module(forName:)),
withSelector: #selector(RCTCxxBridge.EXDevLauncher_module(forName:)),
forClass: RCTCxxBridge.self
)
EXDevLauncherUtils.swizzle(
selector: #selector(RCTCxxBridge.module(forName:lazilyLoadIfNecessary:)),
withSelector: #selector(RCTCxxBridge.EXDevLauncher_module(forName:lazilyLoadIfNecessary:)),
forClass: RCTCxxBridge.self
)
EXDevLauncherUtils.swizzle(
selector: #selector(RCTCxxBridge.module(for:)),
withSelector: #selector(RCTCxxBridge.EXDevLauncher_module(forClass:)),
forClass: RCTCxxBridge.self
)
}
}
extension RCTCxxBridge {
@objc
func EXDevLauncher_module(forName name: String) -> Any? {
let orginalModule = self.EXDevLauncher_module(forName: name)
return replaceRedBox(orginalModule)
}
@objc
func EXDevLauncher_module(forName name: String, lazilyLoadIfNecessary lazilyLoad: Bool) -> Any? {
let orginalModule = self.EXDevLauncher_module(forName: name, lazilyLoadIfNecessary: lazilyLoad)
return replaceRedBox(orginalModule)
}
@objc
func EXDevLauncher_module(forClass clazz: Any) -> Any? {
let orginalModule = self.EXDevLauncher_module(forClass: clazz)
return replaceRedBox(orginalModule)
}
@objc
private func replaceRedBox(_ module: Any?) -> Any? {
if module is RCTRedBox {
let logBox = EXDevLauncher_module(forClass: RCTLogBox.self) as? RCTLogBox
let customRedBox = EXDevLauncherRedBoxInterceptor.customRedBox
customRedBox.register(logBox)
return customRedBox.unsafe_castToRCTRedBox()
}
return module
}
}