// 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 } }