diff options
Diffstat (limited to 'wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt')
-rw-r--r-- | wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt | 126 |
1 files changed, 53 insertions, 73 deletions
diff --git a/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt index 47c2322..b5d2409 100644 --- a/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt +++ b/wallet/src/main/java/net/taler/wallet/deposit/MakeDepositComposable.kt @@ -22,9 +22,8 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.MaterialTheme 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 @@ -41,22 +40,23 @@ import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalFocusManager -import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import net.taler.common.Amount import net.taler.wallet.R +import net.taler.wallet.transactions.AmountType.Negative +import net.taler.wallet.transactions.AmountType.Positive +import net.taler.wallet.transactions.TransactionAmountComposable -@OptIn(ExperimentalMaterial3Api::class) @Composable fun MakeDepositComposable( state: DepositState, amount: Amount, presetName: String? = null, presetIban: String? = null, - onMakeDeposit: (Amount, String, String, String) -> Unit, + onMakeDeposit: (Amount, String, String) -> Unit, ) { val scrollState = rememberScrollState() Column( @@ -67,17 +67,18 @@ fun MakeDepositComposable( ) { var name by rememberSaveable { mutableStateOf(presetName ?: "") } var iban by rememberSaveable { mutableStateOf(presetIban ?: "") } - var bic by rememberSaveable { mutableStateOf("") } val focusRequester = remember { FocusRequester() } OutlinedTextField( modifier = Modifier .padding(16.dp) - .focusRequester(focusRequester), + .focusRequester(focusRequester) + .fillMaxWidth(), value = name, enabled = !state.showFees, onValueChange = { input -> name = input }, + singleLine = true, isError = name.isBlank(), label = { Text( @@ -91,53 +92,40 @@ fun MakeDepositComposable( LaunchedEffect(Unit) { focusRequester.requestFocus() } + val ibanError = state is DepositState.IbanInvalid OutlinedTextField( modifier = Modifier - .padding(16.dp), + .padding(horizontal = 16.dp) + .fillMaxWidth(), value = iban, + singleLine = true, enabled = !state.showFees, onValueChange = { input -> - iban = input + iban = input.uppercase() + }, + isError = ibanError, + supportingText = { + if (ibanError) { + Text( + modifier = Modifier.fillMaxWidth(), + text = stringResource(R.string.send_deposit_iban_error), + color = MaterialTheme.colorScheme.error + ) + } }, - isError = iban.isBlank(), label = { Text( text = stringResource(R.string.send_deposit_iban), - color = if (iban.isBlank()) { + color = if (ibanError) { MaterialTheme.colorScheme.error } else Color.Unspecified, ) } ) - OutlinedTextField( - modifier = Modifier - .padding(16.dp), - value = bic, - enabled = !state.showFees, - onValueChange = { input -> - bic = input - }, - label = { - Text( - text = stringResource(R.string.send_deposit_bic), - ) - } - ) - val amountTitle = if (state.effectiveDepositAmount == null) { - R.string.amount_chosen - } else R.string.send_deposit_amount_effective - Text( - modifier = Modifier.padding(horizontal = 16.dp), - text = stringResource(id = amountTitle), - ) - val shownAmount = if (state.effectiveDepositAmount == null) amount else { - state.effectiveDepositAmount - } - Text( - modifier = Modifier.padding(16.dp), - fontSize = 24.sp, - color = colorResource(R.color.green), - text = shownAmount.toString(), + TransactionAmountComposable( + label = stringResource(R.string.amount_chosen), + amount = amount, + amountType = Positive, ) AnimatedVisibility(visible = state.showFees) { Column( @@ -146,30 +134,20 @@ fun MakeDepositComposable( ) { val totalAmount = state.totalDepositCost ?: amount val effectiveAmount = state.effectiveDepositAmount ?: Amount.zero(amount.currency) - val fee = totalAmount - effectiveAmount - Text( - modifier = Modifier.padding(horizontal = 16.dp), - text = stringResource(id = R.string.withdraw_fees), - ) - Text( - modifier = Modifier.padding(16.dp), - fontSize = 24.sp, - color = if (fee.isZero()) colorResource(R.color.green) else MaterialTheme.colorScheme.error, - text = if (fee.isZero()) { - fee.toString() - } else { - stringResource(R.string.amount_negative, fee.toString()) - }, - ) - Text( - modifier = Modifier.padding(horizontal = 16.dp), - text = stringResource(id = R.string.send_amount), - ) - Text( - modifier = Modifier.padding(16.dp), - fontSize = 24.sp, - color = colorResource(R.color.green), - text = totalAmount.toString(), + if (totalAmount > effectiveAmount) { + val fee = totalAmount - effectiveAmount + + TransactionAmountComposable( + label = stringResource(R.string.withdraw_fees), + amount = fee.withSpec(amount.spec), + amountType = Negative, + ) + } + + TransactionAmountComposable( + label = stringResource(R.string.send_amount), + amount = effectiveAmount.withSpec(amount.spec), + amountType = Positive, ) } } @@ -178,7 +156,7 @@ fun MakeDepositComposable( modifier = Modifier.padding(16.dp), fontSize = 18.sp, color = MaterialTheme.colorScheme.error, - text = (state as? DepositState.Error)?.msg ?: "", + text = (state as? DepositState.Error)?.error?.userFacingMsg ?: "", ) } val focusManager = LocalFocusManager.current @@ -187,13 +165,15 @@ fun MakeDepositComposable( enabled = iban.isNotBlank(), onClick = { focusManager.clearFocus() - onMakeDeposit(amount, name, iban, bic) + onMakeDeposit(amount, name, iban) }, ) { - Text(text = stringResource( - if (state.showFees) R.string.send_deposit_create_button - else R.string.send_deposit_check_fees_button - )) + Text( + text = stringResource( + if (state is DepositState.FeesChecked) R.string.send_deposit_create_button + else R.string.send_deposit_check_fees_button + ) + ) } } } @@ -203,12 +183,12 @@ fun MakeDepositComposable( fun PreviewMakeDepositComposable() { Surface { val state = DepositState.FeesChecked( - effectiveDepositAmount = Amount.fromDouble("TESTKUDOS", 42.00), - totalDepositCost = Amount.fromDouble("TESTKUDOS", 42.23), + effectiveDepositAmount = Amount.fromString("TESTKUDOS", "42.00"), + totalDepositCost = Amount.fromString("TESTKUDOS", "42.23"), ) MakeDepositComposable( state = state, - amount = Amount.fromDouble("TESTKUDOS", 42.23)) { _, _, _, _ -> + amount = Amount.fromString("TESTKUDOS", "42.23")) { _, _, _ -> } } } |