Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

[MBL-1905] Revert "[MBL-1613]" #2207

Merged
merged 3 commits into from
Dec 9, 2024
Merged
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 @@ -277,13 +277,13 @@ final class NoShippingPostCampaignCheckoutViewController: UIViewController,
self.confirmPayment(with: validation)
}

self.viewModel.outputs.showErrorBanner
self.viewModel.outputs.showErrorBannerWithMessage
.observeForControllerAction()
.observeValues { [weak self] errorMessage, shouldPersist in
.observeValues { [weak self] errorMessage in
self?.messageBannerViewController?.showBanner(
with: .error,
message: errorMessage,
dismissType: shouldPersist ? .persist : .bannerOnly
dismissType: .bannerAndViewController
)
}

Expand All @@ -306,6 +306,21 @@ final class NoShippingPostCampaignCheckoutViewController: UIViewController,
let thanksVC = ThanksViewController.configured(with: thanksPageData)
self?.navigationController?.pushViewController(thanksVC, animated: true)
}

self.viewModel.outputs.checkoutError
.observeForUI()
.observeValues { [weak self] error in

#if DEBUG
let serverError = error.errorMessages.first ?? "Unknown server error"
let message = "\(Strings.Something_went_wrong_please_try_again())\n\(serverError)"
#else
let message = Strings.Something_went_wrong_please_try_again()
#endif

self?.messageBannerViewController?
.showBanner(with: .error, message: message, dismissType: .bannerAndViewController)
}
}

// MARK: - Functions
Expand Down Expand Up @@ -345,7 +360,7 @@ final class NoShippingPostCampaignCheckoutViewController: UIViewController,
.showBanner(
with: .error,
message: Strings.Something_went_wrong_please_try_again(),
dismissType: .bannerOnly
dismissType: .bannerAndViewController
)
}
self.viewModel.inputs.checkoutTerminated()
Expand Down Expand Up @@ -440,11 +455,17 @@ extension NoShippingPostCampaignCheckoutViewController: PledgePaymentMethodsView
// MARK: - PledgeViewControllerMessageDisplaying

extension NoShippingPostCampaignCheckoutViewController: PledgeViewControllerMessageDisplaying {
func pledgeViewController(_: UIViewController, didErrorWith message: String, error _: Error?) {
func pledgeViewController(_: UIViewController, didErrorWith message: String, error: Error?) {
// If the error is a stripe error from attempting to add a new card, dismiss the banner only
// instead of restarting the checkout flow.
let stripeError = error as? NSError
let dismissBannerOnly = stripeError?.domain == STPError.stripeDomain &&
stripeError?.code == STPErrorCode.cardError.rawValue

self.messageBannerViewController?.showBanner(
with: .error,
message: message,
dismissType: .bannerOnly
dismissType: dismissBannerOnly ? .bannerOnly : .bannerAndViewController
)
}

Expand Down Expand Up @@ -488,7 +509,7 @@ extension NoShippingPostCampaignCheckoutViewController: STPApplePayContextDelega
.showBanner(
with: .error,
message: Strings.Something_went_wrong_please_try_again(),
dismissType: .bannerOnly
dismissType: .bannerAndViewController
)
case .userCancellation:
// User canceled the payment
Expand Down
38 changes: 15 additions & 23 deletions Library/ViewModels/NoShippingPostCampaignCheckoutViewModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,12 @@ public protocol NoShippingPostCampaignCheckoutViewModelOutputs {
var goToLogin#: Signal<(LoginIntent, Project, Reward), Never> { get }
var paymentMethodsViewHidden: Signal<Bool, Never> { get }
var processingViewIsHidden: Signal<Bool, Never> { get }
var showErrorBanner: Signal<(message: String, persist: Bool), Never> { get }
var showErrorBannerWithMessage: Signal<String, Never> { get }
var showWebHelp: Signal<HelpType, Never> { get }
var validateCheckoutSuccess: Signal<PaymentSourceValidation, Never> { get }
var goToApplePayPaymentAuthorization: Signal<PostCampaignPaymentAuthorizationData, Never> { get }
var checkoutComplete: Signal<ThanksPageData, Never> { get }
var checkoutError: Signal<ErrorEnvelope, Never> { get }
}

public protocol NoShippingPostCampaignCheckoutViewModelType {
Expand Down Expand Up @@ -178,7 +179,7 @@ public class NoShippingPostCampaignCheckoutViewModel: NoShippingPostCampaignChec

let backingId = createCheckoutEvents.values().map(\.checkout.backingId)

let createCheckoutError = createCheckoutEvents.errors()
let createCheckoutErrors = createCheckoutEvents.errors()

// MARK: Configure views

Expand Down Expand Up @@ -515,30 +516,20 @@ public class NoShippingPostCampaignCheckoutViewModel: NoShippingPostCampaignChec
.takeWhen(checkoutCompleteSignal.signal.values())
.map { $0 }

let checkoutError = checkoutCompleteSignal.signal.errors()
self.checkoutError = checkoutCompleteSignal.signal.errors()

// MARK: - Error handling

self.showErrorBanner = Signal.merge(
createCheckoutError.map { ($0, true) },
validateCheckoutError.map { ($0, false) },
checkoutError.map { ($0, false) }
)
.map { error, shouldPersist in
if error.ksrCode == .ValidateCheckoutError, let message = error.errorMessages.first {
return (message: message, persist: shouldPersist)
self.showErrorBannerWithMessage = Signal.merge(createCheckoutErrors, validateCheckoutError)
.map { error in
switch error.ksrCode {
case .ValidateCheckoutError:
return error.errorMessages.first ?? Strings.Something_went_wrong_please_try_again()
default:
return Strings.Something_went_wrong_please_try_again()
}
}

#if DEBUG
let serverError = error.errorMessages.first ?? ""
let message = "\(Strings.Something_went_wrong_please_try_again())\n\(serverError)"
#else
let message = Strings.Something_went_wrong_please_try_again()
#endif

return (message: message, persist: shouldPersist)
}

// MARK: - UI related to checkout flow

let existingCardActivatesPledgeButton = validateCheckoutExistingCardInput
Expand Down Expand Up @@ -580,7 +571,7 @@ public class NoShippingPostCampaignCheckoutViewModel: NoShippingPostCampaignChec
// Use checkoutId in tracking, or default to nil if creating it errors.
let checkoutIdOrNil = Signal.merge(
checkoutId.wrapInOptional(),
createCheckoutError.mapConst(nil).take(first: 1)
createCheckoutErrors.mapConst(nil).take(first: 1)
)

let checkoutData = Signal.combineLatest(
Expand Down Expand Up @@ -762,12 +753,13 @@ public class NoShippingPostCampaignCheckoutViewModel: NoShippingPostCampaignChec
public let estimatedShippingViewHidden: Signal<Bool, Never>
public let goToLogin#: Signal<(LoginIntent, Project, Reward), Never>
public let processingViewIsHidden: Signal<Bool, Never>
public let showErrorBanner: Signal<(message: String, persist: Bool), Never>
public let showErrorBannerWithMessage: Signal<String, Never>
public let showWebHelp: Signal<HelpType, Never>
public let paymentMethodsViewHidden: Signal<Bool, Never>
public let validateCheckoutSuccess: Signal<PaymentSourceValidation, Never>
public let goToApplePayPaymentAuthorization: Signal<PostCampaignPaymentAuthorizationData, Never>
public let checkoutComplete: Signal<ThanksPageData, Never>
public let checkoutError: Signal<ErrorEnvelope, Never>

public var inputs: NoShippingPostCampaignCheckoutViewModelInputs { return self }
public var outputs: NoShippingPostCampaignCheckoutViewModelOutputs { return self }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ final class NoShippingPostCampaignCheckoutViewModelTests: TestCase {
private let checkoutComplete = TestObserver<ThanksPageData, Never>()
private let processingViewIsHidden = TestObserver<Bool, Never>()
private let validateCheckoutSuccess = TestObserver<PaymentSourceValidation, Never>()
private let showErrorBanner = TestObserver<(message: String, persist: Bool), Never>()
private let checkoutError = TestObserver<ErrorEnvelope, Never>()
private let goToLogin# = TestObserver<(LoginIntent, Project, Reward), Never>()

private let configurePaymentMethodsViewControllerWithUser = TestObserver<User, Never>()
Expand All @@ -47,7 +47,7 @@ final class NoShippingPostCampaignCheckoutViewModelTests: TestCase {
self.vm.checkoutComplete.observe(self.checkoutComplete.observer)
self.vm.processingViewIsHidden.observe(self.processingViewIsHidden.observer)
self.vm.validateCheckoutSuccess.observe(self.validateCheckoutSuccess.observer)
self.vm.showErrorBanner.observe(self.showErrorBanner.observer)
self.vm.checkoutError.observe(self.checkoutError.observer)
self.vm.goToLogin#.observe(self.goToLogin#.observer)

self.vm.outputs.configurePaymentMethodsViewControllerWithValue.map { $0.0 }
Expand Down Expand Up @@ -872,7 +872,7 @@ final class NoShippingPostCampaignCheckoutViewModelTests: TestCase {
self.vm.inputs.goToLogin#Tapped()

self.goToLogin#.assertDidEmitValue()
self.showErrorBanner.assertDidNotEmitValue()
self.checkoutError.assertDidNotEmitValue()
}
}
}