From 706f1a299d02bed2a88a1bd8b399ce4a03b9a7b6 Mon Sep 17 00:00:00 2001 From: Andy Boedo Date: Fri, 27 Dec 2024 15:44:39 -0300 Subject: [PATCH 1/6] fixed navigation with new param --- .../Views/CompatibilityNavigationStack.swift | 11 ++++++++++- .../Views/CustomerCenterView.swift | 18 ++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/RevenueCatUI/CustomerCenter/Views/CompatibilityNavigationStack.swift b/RevenueCatUI/CustomerCenter/Views/CompatibilityNavigationStack.swift index c382430c08..ffa7069666 100644 --- a/RevenueCatUI/CustomerCenter/Views/CompatibilityNavigationStack.swift +++ b/RevenueCatUI/CustomerCenter/Views/CompatibilityNavigationStack.swift @@ -24,9 +24,18 @@ import SwiftUI struct CompatibilityNavigationStack: View { @ViewBuilder var content: Content + let isInNavigationStack: Bool + + init(isInNavigationStack: Bool = false, + @ViewBuilder content: () -> Content) { + self.isInNavigationStack = isInNavigationStack + self.content = content() + } var body: some View { - if #available(iOS 16.0, *) { + if isInNavigationStack { + content + } else if #available(iOS 16.0, *) { NavigationStack { content } diff --git a/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift b/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift index 88dc1a8b15..366af8ba5c 100644 --- a/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift +++ b/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift @@ -42,30 +42,40 @@ public struct CustomerCenterView: View { private var colorScheme private let mode: CustomerCenterPresentationMode + private let isInNavigationStack: Bool /// Create a view to handle common customer support tasks /// - Parameters: /// - customerCenterActionHandler: An optional `CustomerCenterActionHandler` to handle actions /// from the Customer Center. - public init(customerCenterActionHandler: CustomerCenterActionHandler? = nil) { - self.init(customerCenterActionHandler: customerCenterActionHandler, mode: .default) + /// - isInNavigationStack: Whether this view is already inside a navigation stack + public init(customerCenterActionHandler: CustomerCenterActionHandler? = nil, + isInNavigationStack: Bool = false) { + self.init(customerCenterActionHandler: customerCenterActionHandler, + mode: .default, + isInNavigationStack: isInNavigationStack) } /// Create a view to handle common customer support tasks /// - Parameters: /// - customerCenterActionHandler: An optional `CustomerCenterActionHandler` to handle actions /// from the Customer Center. + /// - mode: The presentation mode for the Customer Center + /// - isInNavigationStack: Whether this view is already inside a navigation stack init(customerCenterActionHandler: CustomerCenterActionHandler? = nil, - mode: CustomerCenterPresentationMode) { + mode: CustomerCenterPresentationMode, + isInNavigationStack: Bool = false) { self._viewModel = .init(wrappedValue: CustomerCenterViewModel(customerCenterActionHandler: customerCenterActionHandler)) self.mode = mode + self.isInNavigationStack = isInNavigationStack } fileprivate init(viewModel: CustomerCenterViewModel, mode: CustomerCenterPresentationMode = CustomerCenterPresentationMode.default) { self._viewModel = .init(wrappedValue: viewModel) self.mode = mode + self.isInNavigationStack = false } // swiftlint:disable:next missing_docs @@ -157,7 +167,7 @@ private extension CustomerCenterView { let accentColor = Color.from(colorInformation: configuration.appearance.accentColor, for: self.colorScheme) - CompatibilityNavigationStack { + CompatibilityNavigationStack(isInNavigationStack: isInNavigationStack) { destinationContent(configuration: configuration) } .applyIf(accentColor != nil, apply: { $0.tint(accentColor) }) From 1356d6e4efeae345f52342cf0f361434973d2290 Mon Sep 17 00:00:00 2001 From: Andy Boedo Date: Fri, 27 Dec 2024 16:25:53 -0300 Subject: [PATCH 2/6] updated the restore purchases alert so that it doesn't use the dismiss env variable from swiftUI --- RevenueCatUI/CustomerCenter/Views/RestorePurchasesAlert.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/RevenueCatUI/CustomerCenter/Views/RestorePurchasesAlert.swift b/RevenueCatUI/CustomerCenter/Views/RestorePurchasesAlert.swift index 81cc4fc4ce..51dffd8a75 100644 --- a/RevenueCatUI/CustomerCenter/Views/RestorePurchasesAlert.swift +++ b/RevenueCatUI/CustomerCenter/Views/RestorePurchasesAlert.swift @@ -34,8 +34,6 @@ struct RestorePurchasesAlert: ViewModifier { @State private var alertType: AlertType = .restorePurchases - @Environment(\.dismiss) - private var dismiss @Environment(\.localization) private var localization @Environment(\.supportInformation) @@ -164,7 +162,7 @@ struct RestorePurchasesAlert: ViewModifier { private func dismissAlert() { self.alertType = .restorePurchases - dismiss() + self.isPresented = false } } From ec663b9766b4b63caa1e1fc2fbc5edf9d071861b Mon Sep 17 00:00:00 2001 From: Facundo Menzella Date: Mon, 13 Jan 2025 13:13:43 +0100 Subject: [PATCH 3/6] revert alert --- RevenueCatUI/CustomerCenter/Views/RestorePurchasesAlert.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/RevenueCatUI/CustomerCenter/Views/RestorePurchasesAlert.swift b/RevenueCatUI/CustomerCenter/Views/RestorePurchasesAlert.swift index 51dffd8a75..81cc4fc4ce 100644 --- a/RevenueCatUI/CustomerCenter/Views/RestorePurchasesAlert.swift +++ b/RevenueCatUI/CustomerCenter/Views/RestorePurchasesAlert.swift @@ -34,6 +34,8 @@ struct RestorePurchasesAlert: ViewModifier { @State private var alertType: AlertType = .restorePurchases + @Environment(\.dismiss) + private var dismiss @Environment(\.localization) private var localization @Environment(\.supportInformation) @@ -162,7 +164,7 @@ struct RestorePurchasesAlert: ViewModifier { private func dismissAlert() { self.alertType = .restorePurchases - self.isPresented = false + dismiss() } } From 643e2efb6563d80ab66b915b4df4907068d96eb3 Mon Sep 17 00:00:00 2001 From: Facundo Menzella Date: Mon, 13 Jan 2025 13:14:23 +0100 Subject: [PATCH 4/6] swiftlint --- .../Views/CompatibilityNavigationStack.swift | 17 +++--- .../Views/CustomerCenterView.swift | 54 +++++++++++++------ 2 files changed, 43 insertions(+), 28 deletions(-) diff --git a/RevenueCatUI/CustomerCenter/Views/CompatibilityNavigationStack.swift b/RevenueCatUI/CustomerCenter/Views/CompatibilityNavigationStack.swift index ffa7069666..f7c0e664ca 100644 --- a/RevenueCatUI/CustomerCenter/Views/CompatibilityNavigationStack.swift +++ b/RevenueCatUI/CustomerCenter/Views/CompatibilityNavigationStack.swift @@ -23,25 +23,20 @@ import SwiftUI @available(watchOS, unavailable) struct CompatibilityNavigationStack: View { - @ViewBuilder var content: Content - let isInNavigationStack: Bool + @ViewBuilder var content: () -> Content - init(isInNavigationStack: Bool = false, - @ViewBuilder content: () -> Content) { - self.isInNavigationStack = isInNavigationStack - self.content = content() + init(@ViewBuilder content: @escaping () -> Content) { + self.content = content } var body: some View { - if isInNavigationStack { - content - } else if #available(iOS 16.0, *) { + if #available(iOS 16.0, *) { NavigationStack { - content + content() } } else { NavigationView { - content + content() } } } diff --git a/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift b/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift index 366af8ba5c..9fc4d66ed9 100644 --- a/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift +++ b/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift @@ -42,18 +42,28 @@ public struct CustomerCenterView: View { private var colorScheme private let mode: CustomerCenterPresentationMode - private let isInNavigationStack: Bool + + /// A flag indicating whether the view is already embedded in a navigation stack. + /// + /// - When set to `true`, the view must be part of an existing NavigationStack / NavigationView. + /// - When set to `false`, the view is not part of an external NavigationStack / NavigationView and uses + /// one internally. + private let isEmbeddedInNavigationStack: Bool /// Create a view to handle common customer support tasks /// - Parameters: /// - customerCenterActionHandler: An optional `CustomerCenterActionHandler` to handle actions /// from the Customer Center. - /// - isInNavigationStack: Whether this view is already inside a navigation stack - public init(customerCenterActionHandler: CustomerCenterActionHandler? = nil, - isInNavigationStack: Bool = false) { - self.init(customerCenterActionHandler: customerCenterActionHandler, - mode: .default, - isInNavigationStack: isInNavigationStack) + /// - isEmbeddedInNavigationStack: Whether this view is already inside a NavigationStack / NavigationView + public init( + customerCenterActionHandler: CustomerCenterActionHandler? = nil, + isEmbeddedInNavigationStack: Bool = false + ) { + self.init( + customerCenterActionHandler: customerCenterActionHandler, + mode: .default, + isEmbeddedInNavigationStack: isEmbeddedInNavigationStack + ) } /// Create a view to handle common customer support tasks @@ -61,21 +71,25 @@ public struct CustomerCenterView: View { /// - customerCenterActionHandler: An optional `CustomerCenterActionHandler` to handle actions /// from the Customer Center. /// - mode: The presentation mode for the Customer Center - /// - isInNavigationStack: Whether this view is already inside a navigation stack - init(customerCenterActionHandler: CustomerCenterActionHandler? = nil, - mode: CustomerCenterPresentationMode, - isInNavigationStack: Bool = false) { + /// - isEmbeddedInNavigationStack: Whether this view is already inside a navigation stack + init( + customerCenterActionHandler: CustomerCenterActionHandler? = nil, + mode: CustomerCenterPresentationMode, + isEmbeddedInNavigationStack: Bool = false + ) { self._viewModel = .init(wrappedValue: CustomerCenterViewModel(customerCenterActionHandler: customerCenterActionHandler)) self.mode = mode - self.isInNavigationStack = isInNavigationStack + self.isEmbeddedInNavigationStack = isEmbeddedInNavigationStack } - fileprivate init(viewModel: CustomerCenterViewModel, - mode: CustomerCenterPresentationMode = CustomerCenterPresentationMode.default) { + fileprivate init( + viewModel: CustomerCenterViewModel, + mode: CustomerCenterPresentationMode = CustomerCenterPresentationMode.default + ) { self._viewModel = .init(wrappedValue: viewModel) self.mode = mode - self.isInNavigationStack = false + self.isEmbeddedInNavigationStack = false } // swiftlint:disable:next missing_docs @@ -167,8 +181,14 @@ private extension CustomerCenterView { let accentColor = Color.from(colorInformation: configuration.appearance.accentColor, for: self.colorScheme) - CompatibilityNavigationStack(isInNavigationStack: isInNavigationStack) { - destinationContent(configuration: configuration) + Group { + if isEmbeddedInNavigationStack { + destinationContent(configuration: configuration) + } else { + CompatibilityNavigationStack { + destinationContent(configuration: configuration) + } + } } .applyIf(accentColor != nil, apply: { $0.tint(accentColor) }) } From 6955aa76d5f17364a3bf774f3e6a7ddb90332beb Mon Sep 17 00:00:00 2001 From: Facundo Menzella Date: Mon, 13 Jan 2025 13:25:07 +0100 Subject: [PATCH 5/6] nits --- RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift b/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift index 9fc4d66ed9..57032ff3c7 100644 --- a/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift +++ b/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift @@ -45,8 +45,8 @@ public struct CustomerCenterView: View { /// A flag indicating whether the view is already embedded in a navigation stack. /// - /// - When set to `true`, the view must be part of an existing NavigationStack / NavigationView. - /// - When set to `false`, the view is not part of an external NavigationStack / NavigationView and uses + /// - When set to `true`, the view must be part of an existing `NavigationStack` / `NavigationView`. + /// - When set to `false`, the view is not part of an external `NavigationStack` / `NavigationView` and uses /// one internally. private let isEmbeddedInNavigationStack: Bool @@ -54,7 +54,7 @@ public struct CustomerCenterView: View { /// - Parameters: /// - customerCenterActionHandler: An optional `CustomerCenterActionHandler` to handle actions /// from the Customer Center. - /// - isEmbeddedInNavigationStack: Whether this view is already inside a NavigationStack / NavigationView + /// - isEmbeddedInNavigationStack: Whether this view is already inside a `NavigationStack` / `NavigationView` public init( customerCenterActionHandler: CustomerCenterActionHandler? = nil, isEmbeddedInNavigationStack: Bool = false From 11548e2ce80748e179ffab98e843bcc21dbc9f3d Mon Sep 17 00:00:00 2001 From: Facundo Menzella Date: Tue, 14 Jan 2025 14:16:29 +0100 Subject: [PATCH 6/6] reverted parens --- .../CustomerCenter/Views/CustomerCenterView.swift | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift b/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift index 57032ff3c7..cc8d2f6067 100644 --- a/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift +++ b/RevenueCatUI/CustomerCenter/Views/CustomerCenterView.swift @@ -46,8 +46,8 @@ public struct CustomerCenterView: View { /// A flag indicating whether the view is already embedded in a navigation stack. /// /// - When set to `true`, the view must be part of an existing `NavigationStack` / `NavigationView`. - /// - When set to `false`, the view is not part of an external `NavigationStack` / `NavigationView` and uses - /// one internally. + /// - When set to `false`, the view is not part of an external `NavigationStack` / `NavigationView` + /// and uses one internally. private let isEmbeddedInNavigationStack: Bool /// Create a view to handle common customer support tasks @@ -57,8 +57,7 @@ public struct CustomerCenterView: View { /// - isEmbeddedInNavigationStack: Whether this view is already inside a `NavigationStack` / `NavigationView` public init( customerCenterActionHandler: CustomerCenterActionHandler? = nil, - isEmbeddedInNavigationStack: Bool = false - ) { + isEmbeddedInNavigationStack: Bool = false) { self.init( customerCenterActionHandler: customerCenterActionHandler, mode: .default, @@ -75,8 +74,7 @@ public struct CustomerCenterView: View { init( customerCenterActionHandler: CustomerCenterActionHandler? = nil, mode: CustomerCenterPresentationMode, - isEmbeddedInNavigationStack: Bool = false - ) { + isEmbeddedInNavigationStack: Bool = false) { self._viewModel = .init(wrappedValue: CustomerCenterViewModel(customerCenterActionHandler: customerCenterActionHandler)) self.mode = mode @@ -85,8 +83,7 @@ public struct CustomerCenterView: View { fileprivate init( viewModel: CustomerCenterViewModel, - mode: CustomerCenterPresentationMode = CustomerCenterPresentationMode.default - ) { + mode: CustomerCenterPresentationMode = CustomerCenterPresentationMode.default) { self._viewModel = .init(wrappedValue: viewModel) self.mode = mode self.isEmbeddedInNavigationStack = false