commit 9c4e20e8dea37ffe833076d3de6720faf88a597d
parent 0ef34dbdcfecfb7ab9ae92896d8e10f6047905fa
Author: Iván Ávalos <avalos@disroot.org>
Date: Thu, 14 Nov 2024 18:20:42 +0100
[wallet] QC: rearranged fields in deposit screen, only allow currency input when filled
Diffstat:
3 files changed, 53 insertions(+), 48 deletions(-)
diff --git a/wallet/src/main/java/net/taler/wallet/compose/AmountInputFIeld.kt b/wallet/src/main/java/net/taler/wallet/compose/AmountInputFIeld.kt
@@ -67,6 +67,7 @@ fun AmountCurrencyField(
supportingText: @Composable (() -> Unit)? = null,
isError: Boolean = false,
readOnly: Boolean = false,
+ enabled: Boolean = true,
) {
Row(modifier = modifier) {
AmountInputFieldBase(
@@ -79,6 +80,7 @@ fun AmountCurrencyField(
isError = isError,
supportingText = supportingText,
readOnly = readOnly,
+ enabled = enabled,
)
if (editableCurrency) {
@@ -87,7 +89,7 @@ fun AmountCurrencyField(
currencies = currencies,
onCurrencyChanged = { onAmountChanged(amount.copy(currency = it)) },
initialCurrency = amount.currency,
- readOnly = false,
+ readOnly = readOnly || !enabled,
)
}
}
@@ -102,6 +104,7 @@ private fun AmountInputFieldBase(
supportingText: @Composable (() -> Unit)? = null,
isError: Boolean = false,
readOnly: Boolean = false,
+ enabled: Boolean = true,
) {
val inputService = LocalTextInputService.current
val interactionSource = remember { MutableInteractionSource() }
@@ -124,7 +127,7 @@ private fun AmountInputFieldBase(
}
LaunchedEffect(isFocused, isClicked) {
- if (readOnly) return@LaunchedEffect
+ if (readOnly && !enabled) return@LaunchedEffect
if (isFocused || isClicked) {
session = startSession(inputService) { commands ->
commands.forEach { cmd ->
@@ -161,6 +164,7 @@ private fun AmountInputFieldBase(
singleLine = true,
maxLines = 1,
interactionSource = interactionSource,
+ enabled = enabled,
)
}
diff --git a/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt
@@ -19,6 +19,7 @@ package net.taler.wallet.deposit
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.imePadding
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
@@ -77,7 +78,8 @@ fun MakeDepositComposable(
Column(
modifier = Modifier
.fillMaxWidth()
- .verticalScroll(scrollState),
+ .verticalScroll(scrollState)
+ .imePadding(),
horizontalAlignment = CenterHorizontally,
) {
// Amount/currency stuff
@@ -156,27 +158,6 @@ fun MakeDepositComposable(
)
}
- AmountCurrencyField(
- modifier = Modifier
- .padding(
- top = 16.dp,
- start = 16.dp,
- end = 16.dp,
- ).fillMaxWidth(),
- amount = amount.withSpec(currencySpec),
- onAmountChanged = { amount = it },
- editableCurrency = true,
- currencies = currencies,
- isError = checkResult !is CheckDepositResult.Success,
- label = { Text(stringResource(R.string.amount_deposit)) },
- supportingText = {
- val res = checkResult
- if (res is CheckDepositResult.InsufficientBalance && res.maxAmountEffective != null) {
- Text(stringResource(R.string.payment_balance_insufficient_max, res.maxAmountEffective))
- }
- }
- )
-
when(selectedWireType) {
WireType.IBAN -> {
var ibanError by rememberSaveable { mutableStateOf(false) }
@@ -216,6 +197,25 @@ fun MakeDepositComposable(
else -> {}
}
+ AmountCurrencyField(
+ modifier = Modifier
+ .padding(horizontal = 16.dp)
+ .fillMaxWidth(),
+ amount = amount.withSpec(currencySpec),
+ onAmountChanged = { amount = it },
+ editableCurrency = true,
+ currencies = currencies,
+ isError = checkResult !is CheckDepositResult.Success,
+ label = { Text(stringResource(R.string.amount_deposit)) },
+ enabled = !formError,
+ supportingText = {
+ val res = checkResult
+ if (res is CheckDepositResult.InsufficientBalance && res.maxAmountEffective != null) {
+ Text(stringResource(R.string.payment_balance_insufficient_max, res.maxAmountEffective))
+ }
+ }
+ )
+
AnimatedVisibility(visible = checkResult is CheckDepositResult.Success) {
val res = checkResult as? CheckDepositResult.Success ?: return@AnimatedVisibility
diff --git a/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositTaler.kt b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositTaler.kt
@@ -45,29 +45,6 @@ fun MakeDepositTaler(
account: String,
onFormEdited: (name: String, host: String, account: String) -> Unit
) {
- OutlinedTextField(
- modifier = Modifier
- .padding(
- bottom = 16.dp,
- start = 16.dp,
- end = 16.dp,
- ).fillMaxWidth(),
- value = name,
- onValueChange = { input ->
- onFormEdited(input, host, account)
- },
- singleLine = true,
- isError = name.isBlank(),
- label = {
- Text(
- stringResource(R.string.send_deposit_name),
- color = if (name.isBlank()) {
- MaterialTheme.colorScheme.error
- } else Color.Unspecified,
- )
- }
- )
-
var expanded by remember { mutableStateOf(false) }
ExposedDropdownMenuBox(
expanded = expanded,
@@ -75,7 +52,11 @@ fun MakeDepositTaler(
) {
OutlinedTextField(
modifier = Modifier
- .padding(horizontal = 16.dp)
+ .padding(
+ bottom = 16.dp,
+ start = 16.dp,
+ end = 16.dp,
+ )
.fillMaxWidth()
.menuAnchor(),
readOnly = true,
@@ -110,6 +91,26 @@ fun MakeDepositTaler(
OutlinedTextField(
modifier = Modifier
+ .padding(horizontal = 16.dp)
+ .fillMaxWidth(),
+ value = name,
+ onValueChange = { input ->
+ onFormEdited(input, host, account)
+ },
+ singleLine = true,
+ isError = name.isBlank(),
+ label = {
+ Text(
+ stringResource(R.string.send_deposit_name),
+ color = if (name.isBlank()) {
+ MaterialTheme.colorScheme.error
+ } else Color.Unspecified,
+ )
+ }
+ )
+
+ OutlinedTextField(
+ modifier = Modifier
.padding(16.dp)
.fillMaxWidth(),
value = account,