diff options
Diffstat (limited to 'wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt')
-rw-r--r-- | wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt | 55 |
1 files changed, 23 insertions, 32 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt b/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt index c2680d5..2581979 100644 --- a/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt +++ b/wallet/src/main/java/net/taler/wallet/SendFundsFragment.kt @@ -27,12 +27,9 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Button -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -44,7 +41,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView 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.core.os.bundleOf @@ -52,12 +48,16 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.navigation.fragment.findNavController import net.taler.common.Amount -import net.taler.common.Amount.Companion.isValidAmountStr +import net.taler.common.CurrencySpecification +import net.taler.wallet.compose.AmountInputField +import net.taler.wallet.compose.DEFAULT_INPUT_DECIMALS import net.taler.wallet.compose.TalerSurface class SendFundsFragment : Fragment() { private val model: MainViewModel by activityViewModels() + private val balanceManager get() = model.balanceManager private val peerManager get() = model.peerManager + private val scopeInfo get() = model.transactionManager.selectedScope ?: error("No scope selected") override fun onCreateView( inflater: LayoutInflater, @@ -67,8 +67,8 @@ class SendFundsFragment : Fragment() { setContent { TalerSurface { SendFundsIntro( - currency = model.transactionManager.selectedCurrency - ?: error("No currency selected"), + currency = scopeInfo.currency, + spec = balanceManager.getSpecForScopeInfo(scopeInfo), hasSufficientBalance = model::hasSufficientBalance, onDeposit = this@SendFundsFragment::onDeposit, onPeerPush = this@SendFundsFragment::onPeerPush, @@ -79,7 +79,7 @@ class SendFundsFragment : Fragment() { override fun onStart() { super.onStart() - activity?.setTitle(R.string.transactions_send_funds) + activity?.setTitle(getString(R.string.transactions_send_funds_title, scopeInfo.currency)) } private fun onDeposit(amount: Amount) { @@ -94,10 +94,10 @@ class SendFundsFragment : Fragment() { } } -@OptIn(ExperimentalMaterial3Api::class) @Composable private fun SendFundsIntro( currency: String, + spec: CurrencySpecification?, hasSufficientBalance: (Amount) -> Boolean, onDeposit: (Amount) -> Unit, onPeerPush: (Amount) -> Unit, @@ -108,7 +108,7 @@ private fun SendFundsIntro( .fillMaxWidth() .verticalScroll(scrollState), ) { - var text by rememberSaveable { mutableStateOf("") } + var text by rememberSaveable { mutableStateOf("0") } var isError by rememberSaveable { mutableStateOf(false) } var insufficientBalance by rememberSaveable { mutableStateOf(false) } Row( @@ -116,38 +116,29 @@ private fun SendFundsIntro( modifier = Modifier .padding(16.dp), ) { - OutlinedTextField( + AmountInputField( modifier = Modifier .weight(1f) .padding(end = 16.dp), value = text, - keyboardOptions = KeyboardOptions.Default.copy(keyboardType = KeyboardType.Decimal), onValueChange = { input -> isError = false insufficientBalance = false - val filtered = input.filter { it.isDigit() || it == '.' } - if (filtered.endsWith('.') || isValidAmountStr(filtered)) text = filtered + text = input }, - isError = isError || insufficientBalance, - label = { - if (isError) { - Text( - stringResource(R.string.receive_amount_invalid), - color = MaterialTheme.colorScheme.error, - ) - } else if (insufficientBalance) { - Text( - stringResource(R.string.payment_balance_insufficient), - color = MaterialTheme.colorScheme.error, - ) - } else { - Text(stringResource(R.string.send_amount)) + label = { Text(stringResource(R.string.send_amount)) }, + supportingText = { + if (isError) Text(stringResource(R.string.receive_amount_invalid)) + else if (insufficientBalance) { + Text(stringResource(R.string.payment_balance_insufficient)) } - } + }, + isError = isError || insufficientBalance, + numberOfDecimals = spec?.numFractionalInputDigits ?: DEFAULT_INPUT_DECIMALS, ) Text( modifier = Modifier, - text = currency, + text = spec?.symbol ?: currency, softWrap = false, style = MaterialTheme.typography.titleLarge, ) @@ -160,7 +151,7 @@ private fun SendFundsIntro( Row(modifier = Modifier.padding(16.dp)) { fun onClickButton(block: (Amount) -> Unit) { val amount = getAmount(currency, text) - if (amount == null) isError = true + if (amount == null || amount.isZero()) isError = true else if (!hasSufficientBalance(amount)) insufficientBalance = true else block(amount) } @@ -200,6 +191,6 @@ private fun SendFundsIntro( @Composable fun PreviewSendFundsIntro() { Surface { - SendFundsIntro("TESTKUDOS", { true }, {}) {} + SendFundsIntro("TESTKUDOS", null, { true }, {}) {} } } |