From 8f826210627065d259c6c3e781067bf69a548aca Mon Sep 17 00:00:00 2001 From: Andy Boedo Date: Mon, 27 Nov 2023 15:22:52 -0300 Subject: [PATCH 1/5] updated the terms of service and privacy policy links to open in-app --- RevenueCatUI/Views/FooterView.swift | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/RevenueCatUI/Views/FooterView.swift b/RevenueCatUI/Views/FooterView.swift index 12f36a23ad..b0163ff3a6 100644 --- a/RevenueCatUI/Views/FooterView.swift +++ b/RevenueCatUI/Views/FooterView.swift @@ -13,6 +13,7 @@ import RevenueCat import SwiftUI +import WebKit @available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) struct FooterView: View { @@ -240,11 +241,10 @@ private struct LinkButton: View { } private func link(for title: String, bundle: Bundle) -> some View { - Link( - Self.localizedString(title, bundle), - destination: self.url - ) - .frame(minHeight: Constants.minimumButtonHeight) + NavigationLink(destination: WebView(url: self.url)) { + Text(Self.localizedString(title, bundle)) + .frame(minHeight: Constants.minimumButtonHeight) + } } private static func localizedString(_ string: String, _ bundle: Bundle) -> String { @@ -257,6 +257,23 @@ private struct LinkButton: View { } +@available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) +@available(watchOS, unavailable) +@available(macOS, unavailable) +@available(tvOS, unavailable) +private struct WebView: UIViewRepresentable { + let url: URL + + func makeUIView(context: Context) -> WKWebView { + return WKWebView() + } + + func updateUIView(_ uiView: WKWebView, context: Context) { + let request = URLRequest(url: url) + uiView.load(request) + } +} + // MARK: - Previews #if DEBUG && canImport(SwiftUI) && canImport(UIKit) From 07ebbd5108192eb3154115de51a7f1528401d2f2 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 8 Dec 2023 10:30:34 -0800 Subject: [PATCH 2/5] Display link as a sheet --- RevenueCatUI/Views/FooterView.swift | 41 ++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/RevenueCatUI/Views/FooterView.swift b/RevenueCatUI/Views/FooterView.swift index b0163ff3a6..0cffb3ffe4 100644 --- a/RevenueCatUI/Views/FooterView.swift +++ b/RevenueCatUI/Views/FooterView.swift @@ -213,6 +213,9 @@ private struct LinkButton: View { @Environment(\.locale) private var locale + @State + private var displayLink = false + let url: URL let titles: [String] @@ -222,12 +225,38 @@ private struct LinkButton: View { } var body: some View { + 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") + } + } + } + } + } + } + + @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 @@ -236,15 +265,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 { - NavigationLink(destination: WebView(url: self.url)) { - Text(Self.localizedString(title, bundle)) - .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 { From c6a2d2fd8b3a8c27126689e534c0f7a3ed844d9c Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 8 Dec 2023 10:30:43 -0800 Subject: [PATCH 3/5] Simplify WebView --- RevenueCatUI/Views/FooterView.swift | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/RevenueCatUI/Views/FooterView.swift b/RevenueCatUI/Views/FooterView.swift index 0cffb3ffe4..2462286ead 100644 --- a/RevenueCatUI/Views/FooterView.swift +++ b/RevenueCatUI/Views/FooterView.swift @@ -289,16 +289,18 @@ private struct LinkButton: View { @available(macOS, unavailable) @available(tvOS, unavailable) private struct WebView: UIViewRepresentable { + let url: URL func makeUIView(context: Context) -> WKWebView { - return WKWebView() - } + let view = WKWebView() + view.load(URLRequest(url: self.url)) - func updateUIView(_ uiView: WKWebView, context: Context) { - let request = URLRequest(url: url) - uiView.load(request) + return view } + + func updateUIView(_ uiView: WKWebView, context: Context) {} + } // MARK: - Previews From d6cbd892f61a7c88c85ee28a291ae9ca515941d3 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 8 Dec 2023 10:36:06 -0800 Subject: [PATCH 4/5] Fix watchOS --- RevenueCatUI/Views/FooterView.swift | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/RevenueCatUI/Views/FooterView.swift b/RevenueCatUI/Views/FooterView.swift index 2462286ead..5e7694511d 100644 --- a/RevenueCatUI/Views/FooterView.swift +++ b/RevenueCatUI/Views/FooterView.swift @@ -13,7 +13,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 { @@ -225,6 +228,7 @@ private struct LinkButton: View { } var body: some View { + #if canImport(WebKit) Button { self.displayLink = true } label: { @@ -247,6 +251,11 @@ private struct LinkButton: View { } } } + #else + Link(destination: self.url) { + self.content + } + #endif } @ViewBuilder @@ -284,8 +293,8 @@ private struct LinkButton: View { } +#if canImport(WebKit) @available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) -@available(watchOS, unavailable) @available(macOS, unavailable) @available(tvOS, unavailable) private struct WebView: UIViewRepresentable { @@ -302,6 +311,7 @@ private struct WebView: UIViewRepresentable { func updateUIView(_ uiView: WKWebView, context: Context) {} } +#endif // MARK: - Previews From c0a14561862056845ad553dc9d1ed5d68f3d5bc8 Mon Sep 17 00:00:00 2001 From: NachoSoto Date: Fri, 8 Dec 2023 10:45:44 -0800 Subject: [PATCH 5/5] Fix macOS --- RevenueCatUI/Views/FooterView.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/RevenueCatUI/Views/FooterView.swift b/RevenueCatUI/Views/FooterView.swift index 5e7694511d..85e9abc206 100644 --- a/RevenueCatUI/Views/FooterView.swift +++ b/RevenueCatUI/Views/FooterView.swift @@ -228,7 +228,7 @@ private struct LinkButton: View { } var body: some View { - #if canImport(WebKit) + #if canImport(WebKit) && !os(macOS) Button { self.displayLink = true } label: { @@ -293,9 +293,8 @@ private struct LinkButton: View { } -#if canImport(WebKit) +#if canImport(WebKit) && !os(macOS) @available(iOS 15.0, macOS 12.0, tvOS 15.0, watchOS 8.0, *) -@available(macOS, unavailable) @available(tvOS, unavailable) private struct WebView: UIViewRepresentable {