From 621351c4c9a68e7b14e64e77b5717016be302aa2 Mon Sep 17 00:00:00 2001 From: Iván Ávalos Date: Wed, 6 Mar 2024 10:36:30 -0600 Subject: [wallet] Improve pending payments UX and error handling --- .../net/taler/wallet/payment/PayTemplateComposable.kt | 11 +++++++++-- .../net/taler/wallet/payment/PayTemplateFragment.kt | 10 ++-------- .../java/net/taler/wallet/payment/PaymentManager.kt | 7 +++---- .../net/taler/wallet/payment/PromptPaymentFragment.kt | 18 +++++++++--------- 4 files changed, 23 insertions(+), 23 deletions(-) (limited to 'wallet/src/main/java/net') diff --git a/wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt b/wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt index e2a8a64..b6c2fb1 100644 --- a/wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt @@ -57,7 +57,7 @@ fun PayTemplateComposable( PayTemplateError(stringResource(R.string.receive_amount_invalid)) } else if (currencies.isEmpty()) { PayTemplateError(stringResource(R.string.payment_balance_insufficient)) - } else when (payStatus) { + } else when (val p = payStatus) { is PayStatus.None -> PayTemplateOrderComposable( currencies = currencies, defaultSummary = defaultSummary, @@ -70,7 +70,14 @@ fun PayTemplateComposable( is PayStatus.Loading -> PayTemplateLoading() is PayStatus.AlreadyPaid -> PayTemplateError(stringResource(R.string.payment_already_paid)) is PayStatus.InsufficientBalance -> PayTemplateError(stringResource(R.string.payment_balance_insufficient)) - is PayStatus.Error -> {} // handled in fragment will show bottom sheet FIXME white page? + is PayStatus.Pending -> { + val error = p.error + PayTemplateError(if (error != null) { + stringResource(R.string.payment_error, error.userFacingMsg) + } else { + stringResource(R.string.payment_template_error) + }) + } is PayStatus.Prepared -> {} // handled in fragment, will redirect is PayStatus.Success -> {} // handled by other UI flow, no need for content here } diff --git a/wallet/src/main/java/net/taler/wallet/payment/PayTemplateFragment.kt b/wallet/src/main/java/net/taler/wallet/payment/PayTemplateFragment.kt index 9712254..4eb2c11 100644 --- a/wallet/src/main/java/net/taler/wallet/payment/PayTemplateFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/payment/PayTemplateFragment.kt @@ -84,14 +84,8 @@ class PayTemplateFragment : Fragment() { findNavController().navigate(R.id.action_promptPayTemplate_to_promptPayment) } - is PayStatus.Error -> if (payStatus.error != null) { - if (model.devMode.value == true) { - showError(payStatus.error) - } else { - showError(R.string.payment_error, payStatus.error.userFacingMsg) - } - } else { - showError(getString(R.string.payment_template_error)) + is PayStatus.Pending -> if (payStatus.error != null && model.devMode.value == true) { + showError(payStatus.error) } else -> {} diff --git a/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt b/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt index 804c6a0..35cd9e6 100644 --- a/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt +++ b/wallet/src/main/java/net/taler/wallet/payment/PaymentManager.kt @@ -55,7 +55,7 @@ sealed class PayStatus { val transactionId: String, ) : PayStatus() - data class Error( + data class Pending( val transactionId: String? = null, val error: TalerErrorInfo? = null, ) : PayStatus() @@ -105,8 +105,7 @@ class PaymentManager( transactionId = response.transactionId, currency = currency, ) - // TODO: is pending == error always? - is ConfirmPayResult.Pending -> PayStatus.Error( + is ConfirmPayResult.Pending -> PayStatus.Pending( transactionId = response.transactionId, error = response.lastError, ) @@ -146,7 +145,7 @@ class PaymentManager( private fun handleError(operation: String, error: TalerErrorInfo) { Log.e(TAG, "got $operation error result $error") - mPayStatus.value = PayStatus.Error(error = error) + mPayStatus.value = PayStatus.Pending(error = error) } } diff --git a/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt b/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt index 656ca08..31c26a0 100644 --- a/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/payment/PromptPaymentFragment.kt @@ -131,14 +131,14 @@ class PromptPaymentFragment : Fragment(), ProductImageClickListener { navigateToTransaction(payStatus.transactionId) Snackbar.make(requireView(), R.string.payment_already_paid, LENGTH_LONG).show() } - is PayStatus.Error -> { + is PayStatus.Pending -> { showLoading(false) - if (payStatus.error != null) { - if (model.devMode.value == true) { - showError(payStatus.error) - } - ui.details.errorView.text = getString(R.string.payment_error, payStatus.error.userFacingMsg) - ui.details.errorView.fadeIn() + paymentManager.resetPayStatus() + navigateToTransaction(payStatus.transactionId) + if (payStatus.error != null && model.devMode.value == true) { + showError(payStatus.error) + } else { + showError(getString(R.string.payment_pending)) } } is PayStatus.None -> { @@ -174,9 +174,9 @@ class PromptPaymentFragment : Fragment(), ProductImageClickListener { f.show(parentFragmentManager, "image") } - private fun navigateToTransaction(id: String) { + private fun navigateToTransaction(id: String?) { lifecycleScope.launch { - if (transactionManager.selectTransaction(id)) { + if (id != null && transactionManager.selectTransaction(id)) { findNavController().navigate(R.id.action_promptPayment_to_nav_transactions_detail_payment) } else { findNavController().navigate(R.id.action_promptPayment_to_nav_main) -- cgit v1.2.3