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