Skip to content

Commit

Permalink
Paywalls: open Terms and Privacy Policy links in-app (#3475)
Browse files Browse the repository at this point in the history
Updated the terms and Privacy Policy links to open within the app,
without exiting to Safari


https://github.com/RevenueCat/purchases-ios/assets/685609/e10df16d-1016-4271-9270-35c4ae8a87d4

---------

Co-authored-by: NachoSoto <ignaciosoto90@gmail.com>
  • Loading branch information
aboedo and NachoSoto authored Dec 8, 2023
1 parent 27138c4 commit 2a9e190
Showing 1 changed file with 63 additions and 8 deletions.
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
#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) {
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

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

0 comments on commit 2a9e190

Please sign in to comment.