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