1 // Copyright 2015-present 650 Industries. All rights reserved.
2 
3 import Foundation
4 import EXDevMenu
5 
6 @objc
7 public class EXDevLauncherUrl: NSObject {
8   @objc
9   public var url: URL
10 
11   @objc
12   public var queryParams: [String: String]
13 
14   @objc
15   public init(_ url: URL) {
16     self.queryParams = EXDevLauncherURLHelper.getQueryParamsForUrl(url)
17     self.url = url
18 
19     if EXDevLauncherURLHelper.isDevLauncherURL(url) {
20       if let urlParam = self.queryParams["url"] {
21         if let urlFromParam = URL.init(string: urlParam) {
22           self.url = EXDevLauncherURLHelper.replaceEXPScheme(urlFromParam, to: "http")
23         }
24       }
25     } else {
26       self.url = EXDevLauncherURLHelper.replaceEXPScheme(self.url, to: "http")
27     }
28 
29     super.init()
30   }
31 }
32 
33 @objc
34 public class EXDevLauncherURLHelper: NSObject {
35   @objc
isDevLauncherURLnull36   public static func isDevLauncherURL(_ url: URL?) -> Bool {
37     return url?.host == "expo-development-client"
38   }
39 
40   @objc
hasUrlQueryParamnull41   public static func hasUrlQueryParam(_ url: URL) -> Bool {
42     var hasUrlQueryParam = false
43 
44     let components = URLComponents.init(url: url, resolvingAgainstBaseURL: false)
45 
46     if ((components?.queryItems?.contains(where: {
47       $0.name == "url" && $0.value != nil
48     })) ?? false) {
49       hasUrlQueryParam = true
50     }
51 
52     return hasUrlQueryParam
53   }
54 
55   @objc
disableOnboardingPopupIfNeedednull56   public static func disableOnboardingPopupIfNeeded(_ url: URL) {
57     let components = URLComponents.init(url: url, resolvingAgainstBaseURL: false)
58 
59     if ((components?.queryItems?.contains(where: {
60       $0.name == "disableOnboarding" && ($0.value ?? "") == "1"
61     })) ?? false) {
62       DevMenuPreferences.isOnboardingFinished = true
63     }
64   }
65 
66   @objc
replaceEXPSchemenull67   public static func replaceEXPScheme(_ url: URL, to scheme: String) -> URL {
68     var components = URLComponents(url: url, resolvingAgainstBaseURL: false)
69     if components?.scheme == "exp" {
70       components?.scheme = scheme
71     }
72     return components?.url ?? url
73   }
74 
75   @objc
getQueryParamsForUrlnull76   public static func getQueryParamsForUrl(_ url: URL) -> [String: String] {
77     let components = URLComponents.init(url: url, resolvingAgainstBaseURL: false)
78     var dict: [String: String] = [:]
79 
80     for parameter in components?.queryItems ?? [] {
81       dict[parameter.name] = parameter.value?.removingPercentEncoding ?? ""
82     }
83 
84     return dict
85   }
86 }
87