diff --git a/Library/ViewModels/PostCampaignCheckoutViewModel.swift b/Library/ViewModels/PostCampaignCheckoutViewModel.swift index c67c4815d2..4054606087 100644 --- a/Library/ViewModels/PostCampaignCheckoutViewModel.swift +++ b/Library/ViewModels/PostCampaignCheckoutViewModel.swift @@ -86,6 +86,7 @@ public class PostCampaignCheckoutViewModel: PostCampaignCheckoutViewModelType, .skipNil() let context = initialData.map(\.context) + let project = initialData.map(\.project) let checkoutId = initialData.map(\.checkoutId) let baseReward = initialData.map(\.rewards).map(\.first) @@ -109,14 +110,23 @@ public class PostCampaignCheckoutViewModel: PostCampaignCheckoutViewModelType, .map { _ in AppEnvironment.current.currentUser } .map(isNotNil) + let shouldEnablePledgeButton = self.creditCardSelectedProperty.signal.skipNil().mapConst(true) + + let pledgeButtonEnabled = Signal.merge( + self.viewDidLoadProperty.signal.mapConst(false), + shouldEnablePledgeButton + ) + .skipRepeats() + self.configurePledgeViewCTAContainerView = Signal.combineLatest( isLoggedIn, + pledgeButtonEnabled, context ) - .map { isLoggedIn, context in + .map { isLoggedIn, pledgeButtonEnabled, context in PledgeViewCTAContainerViewData( isLoggedIn: isLoggedIn, - isEnabled: true, // Pledge button never needs to be disabled on checkout page. + isEnabled: pledgeButtonEnabled, context: context, willRetryPaymentMethod: false // Only retry in the `fixPaymentMethod` context. ) diff --git a/Library/ViewModels/PostCampaignCheckoutViewModelTests.swift b/Library/ViewModels/PostCampaignCheckoutViewModelTests.swift index 51ba3464f8..cad93a3908 100644 --- a/Library/ViewModels/PostCampaignCheckoutViewModelTests.swift +++ b/Library/ViewModels/PostCampaignCheckoutViewModelTests.swift @@ -15,12 +15,23 @@ final class PostCampaignCheckoutViewModelTests: TestCase { fileprivate let processingViewIsHidden = TestObserver() fileprivate let validateCheckoutSuccess = TestObserver() + private let configurePledgeViewCTAContainerViewIsLoggedIn = TestObserver() + private let configurePledgeViewCTAContainerViewIsEnabled = TestObserver() + private let configurePledgeViewCTAContainerViewContext = TestObserver() + override func setUp() { super.setUp() self.vm.goToApplePayPaymentAuthorization.observe(self.goToApplePayPaymentAuthorization.observer) self.vm.checkoutComplete.observe(self.checkoutComplete.observer) self.vm.processingViewIsHidden.observe(self.processingViewIsHidden.observer) self.vm.validateCheckoutSuccess.observe(self.validateCheckoutSuccess.observer) + + self.vm.outputs.configurePledgeViewCTAContainerView.map { $0.0 } + .observe(self.configurePledgeViewCTAContainerViewIsLoggedIn.observer) + self.vm.outputs.configurePledgeViewCTAContainerView.map { $0.1 } + .observe(self.configurePledgeViewCTAContainerViewIsEnabled.observer) + self.vm.outputs.configurePledgeViewCTAContainerView.map { $0.2 } + .observe(self.configurePledgeViewCTAContainerViewContext.observer) } func testApplePayAuthorization_noReward_isCorrect() { @@ -383,8 +394,14 @@ final class PostCampaignCheckoutViewModelTests: TestCase { self.vm.viewDidLoad() let paymentSource = PaymentSourceSelected.paymentIntentClientSecret("123") + self.vm.inputs .creditCardSelected(source: paymentSource, paymentMethodId: "123", isNewPaymentMethod: true) + + self.configurePledgeViewCTAContainerViewIsLoggedIn.assertValues([false, false]) + self.configurePledgeViewCTAContainerViewIsEnabled.assertValues([false, true]) + self.configurePledgeViewCTAContainerViewContext.assertValues([.latePledge, .latePledge]) + self.vm.inputs.submitButtonTapped() self.processingViewIsHidden.assertLastValue(false) @@ -429,6 +446,11 @@ final class PostCampaignCheckoutViewModelTests: TestCase { let paymentSource = PaymentSourceSelected.paymentIntentClientSecret("123") self.vm.inputs .creditCardSelected(source: paymentSource, paymentMethodId: "123", isNewPaymentMethod: true) + + self.configurePledgeViewCTAContainerViewIsLoggedIn.assertValues([false, false]) + self.configurePledgeViewCTAContainerViewIsEnabled.assertValues([false, true]) + self.configurePledgeViewCTAContainerViewContext.assertValues([.latePledge, .latePledge]) + self.vm.inputs.submitButtonTapped() self.processingViewIsHidden.assertLastValue(false) @@ -469,6 +491,11 @@ final class PostCampaignCheckoutViewModelTests: TestCase { let paymentSource = PaymentSourceSelected.paymentIntentClientSecret("123") self.vm.inputs .creditCardSelected(source: paymentSource, paymentMethodId: "123", isNewPaymentMethod: true) + + self.configurePledgeViewCTAContainerViewIsLoggedIn.assertValues([false, false]) + self.configurePledgeViewCTAContainerViewIsEnabled.assertValues([false, true]) + self.configurePledgeViewCTAContainerViewContext.assertValues([.latePledge, .latePledge]) + self.vm.inputs.submitButtonTapped() self.processingViewIsHidden.assertLastValue(false) @@ -483,4 +510,36 @@ final class PostCampaignCheckoutViewModelTests: TestCase { self.processingViewIsHidden.assertLastValue(true) } } + + func testPledgeViewCTA_LoggedIn_State() { + let mockService = MockService(serverConfig: ServerConfig.staging) + + withEnvironment(apiService: mockService, currentUser: .template) { + let project = Project.cosmicSurgery + let reward = Reward.noReward |> Reward.lens.minimum .~ 5 + + let data = PostCampaignCheckoutData( + project: project, + rewards: [reward], + selectedQuantities: [:], + bonusAmount: 0, + total: 5, + shipping: nil, + refTag: nil, + context: .latePledge, + checkoutId: "0" + ) + + self.vm.inputs.configure(with: data) + self.vm.inputs.viewDidLoad() + + let paymentSource = PaymentSourceSelected.paymentIntentClientSecret("123") + self.vm.inputs + .creditCardSelected(source: paymentSource, paymentMethodId: "123", isNewPaymentMethod: true) + + self.configurePledgeViewCTAContainerViewIsLoggedIn.assertValues([true, true]) + self.configurePledgeViewCTAContainerViewIsEnabled.assertValues([false, true]) + self.configurePledgeViewCTAContainerViewContext.assertValues([.latePledge, .latePledge]) + } + } }