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 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