ssap_app/node_modules/expo-dev-launcher/ios/EXDevLauncherURLHelper.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
}
}