1 // Copyright 2022-present 650 Industries. All rights reserved.
2 
3 import SafariServices
4 import ABI49_0_0ExpoModulesCore
5 import AuthenticationServices
6 
7 final public class WebBrowserModule: Module {
8   private var currentWebBrowserSession: WebBrowserSession?
9   private var currentAuthSession: WebAuthSession?
10 
isValidnull11   private func isValid(url: URL) -> Bool {
12     return url.scheme == "http" || url.scheme == "https"
13   }
14 
definitionnull15   public func definition() -> ModuleDefinition {
16     Name("ExpoWebBrowser")
17 
18     AsyncFunction("openBrowserAsync") { (url: URL, options: WebBrowserOptions, promise: Promise) in
19       guard self.currentWebBrowserSession == nil else {
20         throw WebBrowserAlreadyOpenException()
21       }
22 
23       guard self.isValid(url: url) else {
24         throw WebBrowserInvalidURLException()
25       }
26 
27       self.currentWebBrowserSession = WebBrowserSession(url: url, options: options) { [promise] type in
28         promise.resolve(["type": type])
29         self.currentWebBrowserSession = nil
30       }
31 
32       self.currentWebBrowserSession?.open()
33     }
34     .runOnQueue(.main)
35 
36     AsyncFunction("dismissBrowser") {
37       currentWebBrowserSession?.dismiss()
38       currentWebBrowserSession = nil
39     }
40     .runOnQueue(.main)
41 
42     // MARK: - AuthSession
43 
44     AsyncFunction("openAuthSessionAsync") { (authUrl: URL, redirectUrl: URL?, options: AuthSessionOptions, promise: Promise) throws in
45       guard self.currentAuthSession?.isOpen != true else {
46         throw WebBrowserAlreadyOpenException()
47       }
48       self.currentAuthSession = WebAuthSession(authUrl: authUrl, redirectUrl: redirectUrl, options: options)
49       self.currentAuthSession?.open(promise)
50     }
51     .runOnQueue(.main)
52 
53     AsyncFunction("dismissAuthSession") {
54       self.currentAuthSession?.dismiss()
55       self.currentAuthSession = nil
56     }
57     .runOnQueue(.main)
58 
59     // MARK: - Stubs for jest-expo-mock-generator
60 
61     AsyncFunction("warmUpAsync") {}
62     AsyncFunction("coolDownAsync") {}
63     AsyncFunction("mayInitWithUrlAsync") {}
64     AsyncFunction("getCustomTabsSupportingBrowsers") {}
65   }
66 }
67