89 lines
2.3 KiB
Swift
89 lines
2.3 KiB
Swift
// Copyright 2015-present 650 Industries. All rights reserved.
|
|
|
|
import Foundation
|
|
import EXDevMenu
|
|
|
|
@objc
|
|
public class EXDevLauncherUrl: NSObject {
|
|
@objc
|
|
public var url: URL
|
|
|
|
@objc
|
|
public var queryParams: [String: String]
|
|
|
|
@objc
|
|
public init(_ url: URL) {
|
|
self.queryParams = EXDevLauncherURLHelper.getQueryParamsForUrl(url)
|
|
|
|
if EXDevLauncherURLHelper.isDevLauncherURL(url),
|
|
let urlParam = queryParams["url"],
|
|
let urlFromParam = URL(string: urlParam) {
|
|
self.url = EXDevLauncherURLHelper.replaceEXPScheme(urlFromParam, to: "http")
|
|
} else {
|
|
self.url = EXDevLauncherURLHelper.replaceEXPScheme(url, to: "http")
|
|
}
|
|
|
|
super.init()
|
|
}
|
|
}
|
|
|
|
@objc
|
|
public class EXDevLauncherURLHelper: NSObject {
|
|
@objc
|
|
public static func isDevLauncherURL(_ url: URL?) -> Bool {
|
|
return url?.host == "expo-development-client"
|
|
}
|
|
|
|
@objc
|
|
public static func hasUrlQueryParam(_ url: URL) -> Bool {
|
|
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
|
|
let queryItems = components.queryItems else {
|
|
return false
|
|
}
|
|
|
|
return queryItems.contains { $0.name == "url" && $0.value != nil }
|
|
}
|
|
|
|
@objc
|
|
public static func disableOnboardingPopupIfNeeded(_ url: URL) {
|
|
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
|
|
let queryItems = components.queryItems else {
|
|
return
|
|
}
|
|
|
|
let shouldDisable = queryItems.contains {
|
|
$0.name == "disableOnboarding" && ($0.value ?? "") == "1"
|
|
}
|
|
|
|
if shouldDisable {
|
|
DevMenuPreferences.isOnboardingFinished = true
|
|
}
|
|
}
|
|
|
|
@objc
|
|
public static func replaceEXPScheme(_ url: URL, to scheme: String) -> URL {
|
|
guard var components = URLComponents(url: url, resolvingAgainstBaseURL: false),
|
|
components.scheme == "exp" else {
|
|
return url
|
|
}
|
|
|
|
components.scheme = scheme
|
|
return components.url ?? url
|
|
}
|
|
|
|
@objc
|
|
public static func getQueryParamsForUrl(_ url: URL) -> [String: String] {
|
|
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: false),
|
|
let queryItems = components.queryItems else {
|
|
return [:]
|
|
}
|
|
|
|
var params: [String: String] = [:]
|
|
for item in queryItems {
|
|
params[item.name] = item.value?.removingPercentEncoding ?? ""
|
|
}
|
|
|
|
return params
|
|
}
|
|
}
|