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

Subscriptions: Fix back navigation button on user.cancel #2740

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
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
Original file line number Diff line number Diff line change
Expand Up @@ -227,7 +227,7 @@ final class SubscriptionPagesUseSubscriptionFeature: Subfeature, ObservableObjec
purchaseTransactionJWS = transactionJWS

case .failure(let error):

setTransactionStatus(.idle)
switch error {
case .cancelledByUser:
setTransactionError(.cancelledByUser)
Expand All @@ -241,7 +241,6 @@ final class SubscriptionPagesUseSubscriptionFeature: Subfeature, ObservableObjec
setTransactionError(.purchaseFailed)
}
originalMessage = original
setTransactionStatus(.idle)
return nil
}

Expand Down
30 changes: 26 additions & 4 deletions DuckDuckGo/Subscription/ViewModel/SubscriptionFlowViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,10 @@
var shouldActivateSubscription = false
var canNavigateBack: Bool = false
var transactionError: SubscriptionPurchaseError?
var shouldHideBackButton = false
var selectedFeature: SelectedFeature = .none
var viewTitle: String = UserText.subscriptionTitle
var shouldDismissView: Bool = false
var backButtonTitle: String = UserText.settingsTitle
}

// Read only View State - Should only be modified from the VM
Expand Down Expand Up @@ -139,7 +140,7 @@

// swiftlint:disable cyclomatic_complexity
@MainActor
private func handleTransactionError(error: SubscriptionPagesUseSubscriptionFeature.UseSubscriptionError) {

Check failure on line 143 in DuckDuckGo/Subscription/ViewModel/SubscriptionFlowViewModel.swift

View workflow job for this annotation

GitHub Actions / SwiftLint

Function body should span 50 lines or less excluding comments and whitespace: currently spans 53 lines (function_body_length)

var isStoreError = false
var isBackendError = false
Expand Down Expand Up @@ -198,6 +199,11 @@
// The observer of `transactionError` does the same calculation, if the error is anything else than .hasActiveSubscription then shows a "Something went wrong" alert
DailyPixel.fireDailyAndCount(pixel: .privacyProPurchaseFailure)
}

// Reset Back Button
backButtonEnabled(true)
updateBackButtonTitle(forURL: self.webViewModel.url)
clearTransactionError()
}
// swiftlint:enable cyclomatic_complexity

Expand All @@ -223,6 +229,7 @@
if strongSelf.backButtonForURL(currentURL: currentURL) {
DispatchQueue.main.async {
strongSelf.state.canNavigateBack = value
strongSelf.updateBackButtonTitle(forURL: currentURL)
}
}
}
Expand All @@ -246,11 +253,16 @@
}

private func backButtonForURL(currentURL: URL) -> Bool {
return currentURL.forComparison() != URL.subscriptionBaseURL.forComparison() &&
currentURL.forComparison() != URL.subscriptionActivateSuccess.forComparison() &&
return currentURL.forComparison() != URL.subscriptionActivateSuccess.forComparison() &&
currentURL.forComparison() != URL.subscriptionPurchase.forComparison()
}

private func updateBackButtonTitle(forURL url: URL?) {
guard let url else { return }
state.backButtonTitle = url.forComparison() == URL.subscriptionBaseURL.forComparison() ? UserText.settingsTitle : UserText.backButtonTitle

}

private func cleanUp() {
transactionStatusTimer?.invalidate()
canGoBackCancellable?.cancel()
Expand All @@ -275,6 +287,11 @@
private func setTransactionStatus(_ status: SubscriptionTransactionStatus) {
self.state.transactionStatus = status

// Hide Back button when processing a transaction
if status != .idle {
self.backButtonEnabled(false)
}

// Fire a temp pixel if status is not back to idle in 60s
// Remove block when removing pixel
// https://app.asana.com/0/1204099484721401/1207003487111848/f
Expand Down Expand Up @@ -337,7 +354,12 @@

@MainActor
func navigateBack() async {
await webViewModel.navigationCoordinator.goBack()
if webViewModel.url?.forComparison() != URL.subscriptionBaseURL.forComparison() &&
webViewModel.canGoBack {
await webViewModel.navigationCoordinator.goBack()
} else {
state.shouldDismissView = true
}
}

@MainActor
Expand Down
8 changes: 6 additions & 2 deletions DuckDuckGo/Subscription/Views/SubscriptionFlowView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ struct SubscriptionFlowView: View {
}
}
.navigationBarTitleDisplayMode(.inline)
.navigationBarBackButtonHidden(viewModel.state.canNavigateBack || viewModel.subFeature.transactionStatus != .idle)
.navigationBarBackButtonHidden(true)
.interactiveDismissDisabled(viewModel.subFeature.transactionStatus != .idle)
.edgesIgnoringSafeArea(.bottom)
.tint(Color(designSystemColor: .textPrimary))
Expand All @@ -94,7 +94,7 @@ struct SubscriptionFlowView: View {
}, label: {
HStack(spacing: 0) {
Image(systemName: Constants.backButtonImage)
Text(UserText.backButtonTitle)
Text(viewModel.state.backButtonTitle)
}

})
Expand Down Expand Up @@ -167,6 +167,10 @@ struct SubscriptionFlowView: View {
}
}

.onChange(of: viewModel.state.shouldDismissView) { _ in
dismiss()
}

.onFirstAppear {
setUpAppearances()
Task { await viewModel.onFirstAppear() }
Expand Down
Loading