summaryrefslogtreecommitdiff
path: root/wallet/src/main/java/net/taler
diff options
context:
space:
mode:
authorIván Ávalos <avalos@disroot.org>2023-08-18 13:49:52 +0200
committerTorsten Grote <t@grobox.de>2023-09-26 18:30:51 +0200
commit6734a0fa768a9acbb3193efbfd1bf7c1897877ce (patch)
tree8aa79487169e573c5b64df316528cbe208eacd5c /wallet/src/main/java/net/taler
parentaa1be463c2a79d673f1dd2dd31538649a1cfb83c (diff)
downloadtaler-android-6734a0fa768a9acbb3193efbfd1bf7c1897877ce.tar.gz
taler-android-6734a0fa768a9acbb3193efbfd1bf7c1897877ce.tar.bz2
taler-android-6734a0fa768a9acbb3193efbfd1bf7c1897877ce.zip
[wallet] Improve internal logic of templates
Diffstat (limited to 'wallet/src/main/java/net/taler')
-rw-r--r--wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt45
-rw-r--r--wallet/src/main/java/net/taler/wallet/payment/PayTemplateFragment.kt46
2 files changed, 58 insertions, 33 deletions
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 3279c71..f9b72f7 100644
--- a/wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt
+++ b/wallet/src/main/java/net/taler/wallet/payment/PayTemplateComposable.kt
@@ -31,7 +31,6 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
@@ -41,15 +40,13 @@ import androidx.compose.ui.Alignment.Companion.Center
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.KeyboardType
+import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
-import androidx.fragment.app.Fragment
-import androidx.lifecycle.asFlow
import net.taler.common.Amount
import net.taler.common.AmountParserException
-import net.taler.common.showError
import net.taler.wallet.AmountResult
-import net.taler.wallet.MainViewModel
import net.taler.wallet.R
+import net.taler.wallet.compose.TalerSurface
import net.taler.wallet.deposit.CurrencyDropdown
@@ -58,9 +55,10 @@ import net.taler.wallet.deposit.CurrencyDropdown
fun PayTemplateComposable(
uri: Uri,
currencies: List<String>,
- fragment: Fragment,
- model: MainViewModel,
+ payStatus: PayStatus,
+ onCreateAmount: (String, String) -> AmountResult,
onSubmit: (Map<String, String>) -> Unit,
+ onError: (resId: Int) -> Unit,
) {
val queryParams = uri.queryParameterNames
@@ -81,9 +79,6 @@ fun PayTemplateComposable(
} else null,
) }
- val payStatus by model.paymentManager.payStatus.asFlow()
- .collectAsState(initial = PayStatus.None)
-
// If wallet is empty, there's no way the user can pay something
if (payStatus is PayStatus.InsufficientBalance || currencies.isEmpty()) {
Box(
@@ -128,16 +123,16 @@ fun PayTemplateComposable(
enabled = summary == null || summary!!.isNotBlank(),
onClick = {
if (amount != null) {
- val result = model.createAmount(
+ val result = onCreateAmount(
amount!!.amountStr,
amount!!.currency,
)
when (result) {
AmountResult.InsufficientBalance -> {
- fragment.showError(R.string.payment_balance_insufficient)
+ onError(R.string.payment_balance_insufficient)
}
AmountResult.InvalidAmount -> {
- fragment.showError(R.string.receive_amount_invalid)
+ onError(R.string.receive_amount_invalid)
}
else -> {
onSubmit(
@@ -218,11 +213,19 @@ private fun AmountField(
}
}
-// TODO cleanup composable
-//@Preview
-//@Composable
-//fun PayTemplateComposablePreview() {
-// TalerSurface {
-// PayTemplateComposable(Uri.EMPTY, listOf("KUDOS"))
-// }
-//}
+@Preview
+@Composable
+fun PayTemplateComposablePreview() {
+ TalerSurface {
+ PayTemplateComposable(
+ uri = Uri.parse("taler://pay-template/demo.backend.taler.net/test?amount=KUDOS&summary="),
+ currencies = listOf("KUDOS", "ARS"),
+ payStatus = PayStatus.None,
+ onCreateAmount = { text, currency ->
+ AmountResult.Success(amount = Amount.fromString(currency, text))
+ },
+ onSubmit = { },
+ onError = { },
+ )
+ }
+}
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 080d319..1812db0 100644
--- a/wallet/src/main/java/net/taler/wallet/payment/PayTemplateFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/payment/PayTemplateFragment.kt
@@ -21,14 +21,19 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
import androidx.compose.ui.platform.ComposeView
import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
+import androidx.lifecycle.asFlow
import androidx.navigation.NavOptions
import androidx.navigation.fragment.findNavController
+import net.taler.common.showError
import net.taler.wallet.MainViewModel
import net.taler.wallet.R
import net.taler.wallet.compose.TalerSurface
+import net.taler.wallet.showError
class PayTemplateFragment : Fragment() {
@@ -46,13 +51,19 @@ class PayTemplateFragment : Fragment() {
return ComposeView(requireContext()).apply {
setContent {
+ val payStatus by model.paymentManager.payStatus
+ .asFlow()
+ .collectAsState(initial = PayStatus.None)
TalerSurface {
PayTemplateComposable(
uri = uri,
currencies = model.getCurrencies(),
- fragment = this@PayTemplateFragment,
- model = model,
+ payStatus = payStatus,
+ onCreateAmount = { text, currency ->
+ model.createAmount(text, currency)
+ },
onSubmit = { createOrder(it) },
+ onError = { this@PayTemplateFragment.showError(it) },
)
}
}
@@ -66,18 +77,29 @@ class PayTemplateFragment : Fragment() {
if (uri.queryParameterNames?.isEmpty() == true) {
createOrder(emptyMap())
}
- }
- private fun createOrder(params: Map<String, String>) {
- model.paymentManager.preparePayForTemplate(uriString, params).invokeOnCompletion {
- // TODO maybe better to observe/collect payStatus instead of invokeOnCompletion
- // and then only reacting to one of the possible payStatus values
- if (model.paymentManager.payStatus.value is PayStatus.Prepared) {
- val navOptions = NavOptions.Builder()
- .setPopUpTo(R.id.nav_main, true)
- .build()
- findNavController().navigate(R.id.action_global_promptPayment, null, navOptions)
+ model.paymentManager.payStatus.observe(viewLifecycleOwner) { payStatus ->
+ when (payStatus) {
+ is PayStatus.Prepared -> {
+ val navOptions = NavOptions.Builder()
+ .setPopUpTo(R.id.nav_main, true)
+ .build()
+ findNavController()
+ .navigate(R.id.action_global_promptPayment, null, navOptions)
+ }
+ is PayStatus.Error -> {
+ if (model.devMode.value == true) {
+ showError(payStatus.error)
+ } else {
+ showError(R.string.payment_template_error, payStatus.error.userFacingMsg)
+ }
+ }
+ else -> {}
}
}
}
+
+ private fun createOrder(params: Map<String, String>) {
+ model.paymentManager.preparePayForTemplate(uriString, params)
+ }
}