From 0ea8c68ea258462107fe10b755fa09b200895730 Mon Sep 17 00:00:00 2001 From: Andrii Vysotskyi Date: Thu, 25 Apr 2024 16:24:39 +0200 Subject: [PATCH] feat(POM-365): support nAPM failed state (#267) --- ...ONativeAlternativePaymentMethodState.swift | 3 ++ ...veAlternativePaymentMethodInteractor.swift | 41 +++++++++++++------ 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/Sources/ProcessOut/Sources/Repositories/Invoices/Responses/PONativeAlternativePaymentMethodState.swift b/Sources/ProcessOut/Sources/Repositories/Invoices/Responses/PONativeAlternativePaymentMethodState.swift index e05e2b909..799df0b66 100644 --- a/Sources/ProcessOut/Sources/Repositories/Invoices/Responses/PONativeAlternativePaymentMethodState.swift +++ b/Sources/ProcessOut/Sources/Repositories/Invoices/Responses/PONativeAlternativePaymentMethodState.swift @@ -17,4 +17,7 @@ public enum PONativeAlternativePaymentMethodState: String, Decodable { /// Invoice is captured. case captured = "CAPTURED" + + /// Payment did fail. + case failed = "FAILED" } diff --git a/Sources/ProcessOut/Sources/UI/Modules/NativeAlternativePaymentMethod/Interactor/PODefaultNativeAlternativePaymentMethodInteractor.swift b/Sources/ProcessOut/Sources/UI/Modules/NativeAlternativePaymentMethod/Interactor/PODefaultNativeAlternativePaymentMethodInteractor.swift index bd911f4fe..433928556 100644 --- a/Sources/ProcessOut/Sources/UI/Modules/NativeAlternativePaymentMethod/Interactor/PODefaultNativeAlternativePaymentMethodInteractor.swift +++ b/Sources/ProcessOut/Sources/UI/Modules/NativeAlternativePaymentMethod/Interactor/PODefaultNativeAlternativePaymentMethodInteractor.swift @@ -114,19 +114,8 @@ import UIKit state = .submitting(snapshot: startedState) invoicesService.initiatePayment(request: request) { [weak self] result in switch result { - case let .success(response) where response.nativeApm.state == .pendingCapture: - self?.send(event: .didSubmitParameters(additionalParametersExpected: false)) - self?.setAwaitingCaptureStateUnchecked( - gateway: startedState.gateway, parameterValues: response.nativeApm.parameterValues - ) - case let .success(response) where response.nativeApm.state == .captured: - self?.setCapturedStateUnchecked( - gateway: startedState.gateway, parameterValues: response.nativeApm.parameterValues - ) case let .success(response): - self?.defaultValues(for: response.nativeApm.parameterDefinitions) { values in - self?.restoreStartedStateAfterSubmission(nativeApm: response.nativeApm, defaultValues: values) - } + self?.completeSubmissionUnchecked(with: response, startedState: startedState) case let .failure(failure): self?.restoreStartedStateAfterSubmissionFailureIfPossible(failure, replaceErrorMessages: true) } @@ -187,6 +176,9 @@ import UIKit case .captured: setCapturedStateUnchecked(gateway: details.gateway, parameterValues: details.parameterValues) return + case .failed: + setFailureStateUnchecked(failure: POFailure(code: .generic(.mobile))) + return } if details.parameters.isEmpty { logger.debug("Will set started state with empty inputs, this may be unexpected") @@ -204,6 +196,31 @@ import UIKit logger.info("Did start payment, waiting for parameters") } + // MARK: - Submission + + private func completeSubmissionUnchecked( + with response: PONativeAlternativePaymentMethodResponse, startedState: State.Started + ) { + switch response.nativeApm.state { + case .customerInput: + defaultValues(for: response.nativeApm.parameterDefinitions) { [weak self] values in + self?.restoreStartedStateAfterSubmission(nativeApm: response.nativeApm, defaultValues: values) + } + case .pendingCapture: + send(event: .didSubmitParameters(additionalParametersExpected: false)) + setAwaitingCaptureStateUnchecked( + gateway: startedState.gateway, parameterValues: response.nativeApm.parameterValues + ) + case .captured: + setCapturedStateUnchecked( + gateway: startedState.gateway, parameterValues: response.nativeApm.parameterValues + ) + case .failed: + let failure = POFailure(code: .generic(.mobile)) + setFailureStateUnchecked(failure: failure) + } + } + // MARK: - Awaiting Capture State private func setAwaitingCaptureStateUnchecked(