Dismiss paywall predictably with Binding<Bool>

This commit is contained in:
Davide De Rosa 2022-04-13 21:01:06 +02:00
parent e7a5d82056
commit 320513dd38
5 changed files with 32 additions and 10 deletions

View File

@ -84,7 +84,7 @@ struct AddProviderView: View {
.navigationTitle(L10n.AddProfile.Shared.title) .navigationTitle(L10n.AddProfile.Shared.title)
.sheet(isPresented: $viewModel.isPaywallPresented) { .sheet(isPresented: $viewModel.isPaywallPresented) {
NavigationView { NavigationView {
PaywallView() PaywallView(isPresented: $viewModel.isPaywallPresented)
}.themeGlobal() }.themeGlobal()
}.onAppear { }.onAppear {
refreshProviders() refreshProviders()

View File

@ -164,7 +164,10 @@ extension OrganizerView {
case .presentPaywallShortcuts: case .presentPaywallShortcuts:
NavigationView { NavigationView {
PaywallView(feature: .siriShortcuts) PaywallView(
modalType: $modalType,
feature: .siriShortcuts
)
}.themeGlobal() }.themeGlobal()
} }
} }

View File

@ -53,18 +53,19 @@ extension PaywallView {
@Environment(\.scenePhase) private var scenePhase @Environment(\.scenePhase) private var scenePhase
@Environment(\.presentationMode) private var presentationMode
@ObservedObject private var productManager: ProductManager @ObservedObject private var productManager: ProductManager
@Binding private var isPresented: Bool
private let feature: LocalProduct? private let feature: LocalProduct?
@State private var alertType: AlertType? @State private var alertType: AlertType?
@State private var purchaseState: PurchaseState? @State private var purchaseState: PurchaseState?
init(feature: LocalProduct? = nil) { init(isPresented: Binding<Bool>, feature: LocalProduct? = nil) {
productManager = .shared productManager = .shared
_isPresented = isPresented
self.feature = feature self.feature = feature
} }
@ -149,7 +150,7 @@ extension PaywallView.PurchaseView {
case .success(let result): case .success(let result):
switch result { switch result {
case .done: case .done:
presentationMode.wrappedValue.dismiss() isPresented = false
case .cancelled: case .cancelled:
break break
@ -172,7 +173,7 @@ extension PaywallView.PurchaseView {
alertType = .restoreFailed(error) alertType = .restoreFailed(error)
return return
} }
presentationMode.wrappedValue.dismiss() isPresented = false
purchaseState = nil purchaseState = nil
} }
} }

View File

@ -28,10 +28,24 @@ import SwiftUI
struct PaywallView: View { struct PaywallView: View {
@ObservedObject private var productManager: ProductManager @ObservedObject private var productManager: ProductManager
@Binding private var isPresented: Bool
private let feature: LocalProduct? private let feature: LocalProduct?
init(feature: LocalProduct? = nil) { init<MT>(modalType: Binding<MT?>, feature: LocalProduct? = nil) {
let isPresented = Binding<Bool> {
modalType.wrappedValue != nil
} set: {
if !$0 {
modalType.wrappedValue = nil
}
}
self.init(isPresented: isPresented, feature: feature)
}
init(isPresented: Binding<Bool>, feature: LocalProduct? = nil) {
productManager = .shared productManager = .shared
_isPresented = isPresented
self.feature = feature self.feature = feature
} }
@ -40,7 +54,10 @@ struct PaywallView: View {
if productManager.cfg.appType == .beta { if productManager.cfg.appType == .beta {
BetaView() BetaView()
} else { } else {
PurchaseView(feature: feature) PurchaseView(
isPresented: $isPresented,
feature: feature
)
} }
}.themeSecondaryView() }.themeSecondaryView()
} }

View File

@ -126,6 +126,7 @@ struct ProfileView: View {
case .paywallTrustedNetworks: case .paywallTrustedNetworks:
NavigationView { NavigationView {
PaywallView( PaywallView(
modalType: $modalType,
feature: .trustedNetworks feature: .trustedNetworks
) )
}.themeGlobal() }.themeGlobal()