Skip to content

Commit

Permalink
Merge pull request #167 from hotwired/expose-external-url-navigation
Browse files Browse the repository at this point in the history
Allow framework users to navigate to an external URL using TurboNavigator
  • Loading branch information
olivaresf authored Jan 11, 2024
2 parents a5bb661 + 3c6f16b commit e908c98
Showing 1 changed file with 27 additions and 16 deletions.
43 changes: 27 additions & 16 deletions Source/Turbo Navigator/TurboNavigator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,31 @@ public class TurboNavigator {
guard let controller = controller(for: proposal) else { return }
hierarchyController.route(controller: controller, proposal: proposal)
}

/// Navigate to an external URL.
///
/// - Parameters:
/// - externalURL: the URL to navigate to
/// - via: navigation action
public func open(externalURL: URL, _ via: ExternalURLNavigationAction) {
switch via {

case .openViaSystem:
UIApplication.shared.open(externalURL)

case .openViaSafariController:
let safariViewController = SFSafariViewController(url: externalURL)
safariViewController.modalPresentationStyle = .pageSheet
if #available(iOS 15.0, *) {
safariViewController.preferredControlTintColor = .tintColor
}

activeNavigationController.present(safariViewController, animated: true)

case .reject:
return
}
}

let session: Session
let modalSession: Session
Expand Down Expand Up @@ -121,22 +146,8 @@ extension TurboNavigator: SessionDelegate {
}

public func session(_ session: Session, openExternalURL externalURL: URL) {
switch delegate.handle(externalURL: externalURL) {
case .openViaSystem:
UIApplication.shared.open(externalURL)

case .openViaSafariController:
let safariViewController = SFSafariViewController(url: externalURL)
safariViewController.modalPresentationStyle = .pageSheet
if #available(iOS 15.0, *) {
safariViewController.preferredControlTintColor = .tintColor
}

activeNavigationController.present(safariViewController, animated: true)

case .reject:
return
}
let decision = delegate.handle(externalURL: externalURL)
open(externalURL: externalURL, decision)
}

public func session(_ session: Session, didFailRequestForVisitable visitable: Visitable, error: Error) {
Expand Down

0 comments on commit e908c98

Please sign in to comment.