Files
Schnappix/node_modules/expo-modules-core/ios/ReactDelegates/ExpoReactDelegate.swift
T

54 lines
2.0 KiB
Swift

// Copyright 2018-present 650 Industries. All rights reserved.
/**
An extensible react instance creation delegate. This class will loop through each `ExpoReactDelegateHandler` to determine the winner to create the instance.
*/
@objc(EXReactDelegate)
public class ExpoReactDelegate: NSObject {
private let handlers: [ExpoReactDelegateHandler]
public let reactNativeFactory: ExpoReactNativeFactoryProtocol
public init(handlers: [ExpoReactDelegateHandler], reactNativeFactory: ExpoReactNativeFactoryProtocol) {
self.handlers = handlers
self.reactNativeFactory = reactNativeFactory
}
@objc
public func createReactRootView(
moduleName: String,
initialProperties: [AnyHashable: Any]?,
launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> UIView {
return self.handlers
.compactMap { $0.createReactRootView(reactDelegate: self, moduleName: moduleName, initialProperties: initialProperties, launchOptions: launchOptions) }
.first(where: { _ in true })
?? {
guard let appDelegate = (UIApplication.shared.delegate as? (any ReactNativeFactoryProvider)) ??
((UIApplication.shared.delegate as? NSObject)?.value(forKey: "_expoAppDelegate") as? (any ReactNativeFactoryProvider)) else {
return reactNativeFactory.recreateRootView(withBundleURL: nil, moduleName: moduleName, initialProps: initialProperties, launchOptions: launchOptions)
}
return appDelegate.recreateRootView(
withBundleURL: nil,
moduleName: moduleName,
initialProps: initialProperties,
launchOptions: launchOptions
)
}()
}
@objc
public func bundleURL() -> URL? {
return self.handlers.lazy
.compactMap { $0.bundleURL(reactDelegate: self) }
.first(where: { _ in true })
}
@objc
public func createRootViewController() -> UIViewController {
return self.handlers.lazy
.compactMap { $0.createRootViewController() }
.first(where: { _ in true }) ?? UIViewController()
}
}