[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.