1 // Copyright 2022-present 650 Industries. All rights reserved. 2 3 import SafariServices 4 import ABI49_0_0ExpoModulesCore 5 6 internal class WebBrowserSession: NSObject, SFSafariViewControllerDelegate, UIAdaptivePresentationControllerDelegate { 7 let viewController: SFSafariViewController 8 let onDismiss: (String) -> Void 9 10 init(url: URL, options: WebBrowserOptions, onDismiss: @escaping (String) -> Void) { 11 self.onDismiss = onDismiss 12 13 let configuration = SFSafariViewController.Configuration() 14 configuration.barCollapsingEnabled = options.enableBarCollapsing 15 configuration.entersReaderIfAvailable = options.readerMode 16 17 viewController = SFSafariViewController(url: url, configuration: configuration) 18 viewController.modalPresentationStyle = options.presentationStyle.toPresentationStyle() 19 viewController.dismissButtonStyle = options.dismissButtonStyle.toSafariDismissButtonStyle() 20 viewController.preferredBarTintColor = options.toolbarColor 21 viewController.preferredControlTintColor = options.controlsColor 22 23 super.init() 24 viewController.delegate = self 25 viewController.presentationController?.delegate = self 26 } 27 28 func open() { 29 var currentViewController = UIApplication.shared.keyWindow?.rootViewController 30 while currentViewController?.presentedViewController != nil { 31 currentViewController = currentViewController?.presentedViewController 32 } 33 currentViewController?.present(viewController, animated: true, completion: nil) 34 } 35 36 func dismiss() { 37 viewController.dismiss(animated: true) { 38 self.finish(type: "dismiss") 39 } 40 } 41 42 // MARK: - SFSafariViewControllerDelegate 43 44 func safariViewControllerDidFinish(_ controller: SFSafariViewController) { 45 finish(type: "cancel") 46 } 47 48 // MARK: - UIAdaptivePresentationControllerDelegate 49 50 func presentationControllerDidDismiss(_ presentationController: UIPresentationController) { 51 finish(type: "cancel") 52 } 53 54 // MARK: - Private 55 56 private func finish(type: String) { 57 onDismiss(type) 58 } 59 } 60