Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Paywalls: open Terms and Privacy Policy links in-app #3475

Merged
merged 5 commits into from
Dec 8, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 63 additions & 8 deletions RevenueCatUI/Views/FooterView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@
import RevenueCat
import SwiftUI

#if canImport(WebKit)
import WebKit
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't exist on watchOS 😅

#endif

@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
struct FooterView: View {

Expand Down Expand Up @@ -212,6 +216,9 @@ private struct LinkButton: View {
@Environment(\.locale)
private var locale

@State
private var displayLink = false

let url: URL
let titles: [String]

Expand All @@ -221,12 +228,44 @@ private struct LinkButton: View {
}

var body: some View {
#if canImport(WebKit) && !os(macOS)
Button {
self.displayLink = true
} label: {
self.content
}
.buttonStyle(.plain)
.sheet(isPresented: self.$displayLink) {
NavigationView {
WebView(url: self.url)
.navigationBarTitleDisplayMode(.inline)
.navigationTitle(self.titles.first ?? "")
.toolbar {
ToolbarItem(placement: .destructiveAction) {
Button {
self.displayLink = false
} label: {
Image(systemName: "xmark")
}
}
}
}
}
#else
Link(destination: self.url) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Keeping the existing implementation if WebKit isn't supported.

self.content
}
#endif
}

@ViewBuilder
private var content: some View {
let bundle = Localization.localizedBundle(self.locale)

if #available(iOS 16.0, macOS 13.0, tvOS 16.0, watchOS 9.0, *) {
ViewThatFits {
ForEach(self.titles, id: \.self) { title in
self.link(for: title, bundle: bundle)
self.linkContent(for: title, bundle: bundle)
}
}
// Only use the largest label for accessibility
Expand All @@ -235,16 +274,13 @@ private struct LinkButton: View {
?? ""
)
} else if let first = self.titles.first {
self.link(for: first, bundle: bundle)
self.linkContent(for: first, bundle: bundle)
}
}

private func link(for title: String, bundle: Bundle) -> some View {
Link(
Self.localizedString(title, bundle),
destination: self.url
)
.frame(minHeight: Constants.minimumButtonHeight)
private func linkContent(for title: String, bundle: Bundle) -> some View {
Text(Self.localizedString(title, bundle))
.frame(minHeight: Constants.minimumButtonHeight)
}

private static func localizedString(_ string: String, _ bundle: Bundle) -> String {
Expand All @@ -257,6 +293,25 @@ private struct LinkButton: View {

}

#if canImport(WebKit) && !os(macOS)
@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *)
@available(tvOS, unavailable)
private struct WebView: UIViewRepresentable {

let url: URL
NachoSoto marked this conversation as resolved.
Show resolved Hide resolved

func makeUIView(context: Context) -> WKWebView {
let view = WKWebView()
view.load(URLRequest(url: self.url))

return view
}

func updateUIView(_ uiView: WKWebView, context: Context) {}

}
#endif

// MARK: - Previews

#if DEBUG && canImport(SwiftUI) && canImport(UIKit)
Expand Down