gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[taler-taler-android] 02/02: [wallet] Check for sufficient balance when


From: gnunet
Subject: [taler-taler-android] 02/02: [wallet] Check for sufficient balance when sending funds
Date: Thu, 27 Oct 2022 15:38:02 +0200

This is an automated email from the git hooks/post-receive script.

torsten-grote pushed a commit to branch master
in repository taler-android.

commit 431e326b1b3212bdcb975957306e45958e2e98e5
Author: Torsten Grote <t@grobox.de>
AuthorDate: Thu Oct 27 10:37:54 2022 -0300

    [wallet] Check for sufficient balance when sending funds
---
 .../main/java/net/taler/wallet/MainViewModel.kt    | 11 +++++++++
 .../java/net/taler/wallet/SendFundsFragment.kt     | 27 +++++++++++++++-------
 2 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt 
b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
index 50438c4..aa9b0f1 100644
--- a/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
+++ b/wallet/src/main/java/net/taler/wallet/MainViewModel.kt
@@ -26,6 +26,7 @@ import androidx.lifecycle.distinctUntilChanged
 import androidx.lifecycle.viewModelScope
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.launch
+import net.taler.common.Amount
 import net.taler.common.Event
 import net.taler.common.assertUiThread
 import net.taler.common.toEvent
@@ -140,6 +141,16 @@ class MainViewModel(val app: Application) : 
AndroidViewModel(app) {
         mTransactionsEvent.value = currency.toEvent()
     }
 
+    @UiThread
+    fun hasSufficientBalance(amount: Amount): Boolean {
+        balances.value?.forEach { balanceItem ->
+            if (balanceItem.currency == amount.currency) {
+                return balanceItem.available >= amount
+            }
+        }
+        return false
+    }
+
     @UiThread
     fun dangerouslyReset() {
         api.sendRequest("reset")
diff --git a/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt 
b/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt
index 60d98a5..d6f7280 100644
--- a/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt
+++ b/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt
@@ -67,6 +67,7 @@ class SendFundsFragment : Fragment() {
                 Surface {
                     SendFundsIntro(
                         model.transactionManager.selectedCurrency ?: error("No 
currency selected"),
+                        model::hasSufficientBalance,
                         this@SendFundsFragment::onDeposit,
                         this@SendFundsFragment::onPeerPush,
                     )
@@ -99,6 +100,7 @@ class SendFundsFragment : Fragment() {
 @Composable
 private fun SendFundsIntro(
     currency: String,
+    hasSufficientBalance: (Amount) -> Boolean,
     onDeposit: (Amount) -> Unit,
     onPeerPush: (Amount) -> Unit,
 ) {
@@ -110,6 +112,7 @@ private fun SendFundsIntro(
     ) {
         var text by rememberSaveable { mutableStateOf("") }
         var isError by rememberSaveable { mutableStateOf(false) }
+        var insufficientBalance by rememberSaveable { mutableStateOf(false) }
         Row(
             verticalAlignment = Alignment.CenterVertically,
             modifier = Modifier
@@ -123,15 +126,21 @@ private fun SendFundsIntro(
                 keyboardOptions = KeyboardOptions.Default.copy(keyboardType = 
KeyboardType.Decimal),
                 onValueChange = { input ->
                     isError = false
+                    insufficientBalance = false
                     text = input.filter { it.isDigit() || it == '.' }
                 },
-                isError = isError,
+                isError = isError || insufficientBalance,
                 label = {
                     if (isError) {
                         Text(
                             stringResource(R.string.receive_amount_invalid),
                             color = Color.Red,
                         )
+                    } else if (insufficientBalance) {
+                        Text(
+                            
stringResource(R.string.payment_balance_insufficient),
+                            color = Color.Red,
+                        )
                     } else {
                         Text(stringResource(R.string.send_amount))
                     }
@@ -150,14 +159,18 @@ private fun SendFundsIntro(
             style = MaterialTheme.typography.h6,
         )
         Row(modifier = Modifier.padding(16.dp)) {
+            fun onClickButton(block: (Amount) -> Unit) {
+                val amount = getAmount(currency, text)
+                if (amount == null) isError = true
+                else if (!hasSufficientBalance(amount)) insufficientBalance = 
true
+                else block(amount)
+            }
             Button(
                 modifier = Modifier
                     .padding(end = 16.dp)
                     .weight(1f),
                 onClick = {
-                    val amount = getAmount(currency, text)
-                    if (amount == null) isError = true
-                    else onDeposit(amount)
+                    onClickButton { amount -> onDeposit(amount) }
                 }) {
                 Text(text = stringResource(R.string.send_deposit))
             }
@@ -166,9 +179,7 @@ private fun SendFundsIntro(
                     .height(IntrinsicSize.Max)
                     .weight(1f),
                 onClick = {
-                    val amount = getAmount(currency, text)
-                    if (amount == null) isError = true
-                    else onPeerPush(amount)
+                    onClickButton { amount -> onPeerPush(amount) }
                 },
             ) {
                 Text(text = stringResource(R.string.send_peer))
@@ -181,6 +192,6 @@ private fun SendFundsIntro(
 @Composable
 fun PreviewSendFundsIntro() {
     Surface {
-        SendFundsIntro("TESTKUDOS", {}) {}
+        SendFundsIntro("TESTKUDOS", { true }, {}) {}
     }
 }

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]