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