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