Adds backport for Link
This commit is contained in:
parent
c89b2fc9af
commit
c6aee2fa79
|
@ -0,0 +1,109 @@
|
||||||
|
import SwiftUI
|
||||||
|
import SwiftBackports
|
||||||
|
|
||||||
|
extension Backport<Any> {
|
||||||
|
/// A control for navigating to a URL.
|
||||||
|
///
|
||||||
|
/// Create a link by providing a destination URL and a title. The title
|
||||||
|
/// tells the user the purpose of the link, and can be a string, a title
|
||||||
|
/// key that produces a localized string, or a view that acts as a label.
|
||||||
|
/// The example below creates a link to `example.com` and displays the
|
||||||
|
/// title string as a link-styled view:
|
||||||
|
///
|
||||||
|
/// Backport.Link("View Our Terms of Service",
|
||||||
|
/// destination: URL(string: "https://www.example.com/TOS.html")!)
|
||||||
|
///
|
||||||
|
/// When a user taps or clicks a `Link`, the default behavior depends on the
|
||||||
|
/// contents of the URL. For example, SwiftUI opens a Universal Link in the
|
||||||
|
/// associated app if possible, or in the user's default web browser if not.
|
||||||
|
/// Alternatively, you can override the default behavior by setting the
|
||||||
|
/// ``EnvironmentValues/openURL`` environment value with a custom
|
||||||
|
/// ``OpenURLAction``:
|
||||||
|
///
|
||||||
|
/// Backport.Link("Visit Our Site", destination: URL(string: "https://www.example.com")!)
|
||||||
|
/// .environment(\.backportOpenURL, Backport.OpenURLAction { url in
|
||||||
|
/// print("Open \(url)")
|
||||||
|
/// return .handled
|
||||||
|
/// })
|
||||||
|
///
|
||||||
|
/// As with other views, you can style links using standard view modifiers
|
||||||
|
/// depending on the view type of the link's label. For example, a ``Text``
|
||||||
|
/// label could be modified with a custom ``View/font(_:)`` or
|
||||||
|
/// ``View/foregroundColor(_:)`` to customize the appearance of the link in
|
||||||
|
/// your app's UI.
|
||||||
|
@available(iOS, deprecated: 14)
|
||||||
|
@available(tvOS, deprecated: 14)
|
||||||
|
@available(macOS, deprecated: 11)
|
||||||
|
@available(watchOS, deprecated: 7)
|
||||||
|
public struct Link<Label>: View where Label: View {
|
||||||
|
@Environment(\.backportOpenURL) private var openUrl
|
||||||
|
let label: Label
|
||||||
|
let destination: URL
|
||||||
|
|
||||||
|
public var body: some View {
|
||||||
|
Button {
|
||||||
|
openUrl(destination)
|
||||||
|
} label: {
|
||||||
|
label
|
||||||
|
}
|
||||||
|
#if os(macOS)
|
||||||
|
.buttonStyle(.link)
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Creates a control, consisting of a URL and a label, used to navigate
|
||||||
|
/// to the given URL.
|
||||||
|
///
|
||||||
|
/// - Parameters:
|
||||||
|
/// - destination: The URL for the link.
|
||||||
|
/// - label: A view that describes the destination of URL.
|
||||||
|
public init(destination: URL, @ViewBuilder label: () -> Label) {
|
||||||
|
self.destination = destination
|
||||||
|
self.label = label()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension Backport<Any>.Link where Label == Text {
|
||||||
|
/// Creates a control, consisting of a URL and a title key, used to
|
||||||
|
/// navigate to a URL.
|
||||||
|
///
|
||||||
|
/// Use ``Link`` to create a control that your app uses to navigate to a
|
||||||
|
/// URL that you provide. The example below creates a link to
|
||||||
|
/// `example.com` and uses `Visit Example Co` as the title key to
|
||||||
|
/// generate a link-styled view in your app:
|
||||||
|
///
|
||||||
|
/// Link("Visit Example Co",
|
||||||
|
/// destination: URL(string: "https://www.example.com/")!)
|
||||||
|
///
|
||||||
|
/// - Parameters:
|
||||||
|
/// - titleKey: The key for the localized title that describes the
|
||||||
|
/// purpose of this link.
|
||||||
|
/// - destination: The URL for the link.
|
||||||
|
public init(_ titleKey: LocalizedStringKey, destination: URL) {
|
||||||
|
self.destination = destination
|
||||||
|
self.label = Text(titleKey)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Creates a control, consisting of a URL and a title string, used to
|
||||||
|
/// navigate to a URL.
|
||||||
|
///
|
||||||
|
/// Use ``Link`` to create a control that your app uses to navigate to a
|
||||||
|
/// URL that you provide. The example below creates a link to
|
||||||
|
/// `example.com` and displays the title string you provide as a
|
||||||
|
/// link-styled view in your app:
|
||||||
|
///
|
||||||
|
/// func marketingLink(_ callToAction: String) -> Link {
|
||||||
|
/// Link(callToAction,
|
||||||
|
/// destination: URL(string: "https://www.example.com/")!)
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// - Parameters:
|
||||||
|
/// - title: A text string used as the title for describing the
|
||||||
|
/// underlying `destination` URL.
|
||||||
|
/// - destination: The URL for the link.
|
||||||
|
public init<S>(_ title: S, destination: URL) where S: StringProtocol {
|
||||||
|
self.destination = destination
|
||||||
|
self.label = Text(title)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue