diff options
author | Iván Ávalos <avalos@disroot.org> | 2023-09-13 16:57:30 -0600 |
---|---|---|
committer | Torsten Grote <t@grobox.de> | 2023-09-26 18:30:52 +0200 |
commit | ed7f77234259113007af8cabeed32a560ccd4f32 (patch) | |
tree | 1f24f06752d036ecd0041922d2f5e4affc558c9a /wallet/src/main/java/net/taler/wallet/compose/AmountInputField.kt | |
parent | 9837f4ba999b65d611ce2b4d2d2af2d3d437c116 (diff) | |
download | taler-android-ed7f77234259113007af8cabeed32a560ccd4f32.tar.gz taler-android-ed7f77234259113007af8cabeed32a560ccd4f32.tar.bz2 taler-android-ed7f77234259113007af8cabeed32a560ccd4f32.zip |
[wallet] Refactor amount input into single composable
Diffstat (limited to 'wallet/src/main/java/net/taler/wallet/compose/AmountInputField.kt')
-rw-r--r-- | wallet/src/main/java/net/taler/wallet/compose/AmountInputField.kt | 89 |
1 files changed, 89 insertions, 0 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 new file mode 100644 index 0000000..79a01c8 --- /dev/null +++ b/wallet/src/main/java/net/taler/wallet/compose/AmountInputField.kt @@ -0,0 +1,89 @@ +/* + * This file is part of GNU Taler + * (C) 2023 Taler Systems S.A. + * + * GNU Taler is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 3, or (at your option) any later version. + * + * GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with + * GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> + */ + +package net.taler.wallet.compose + +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.LocalTextStyle +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Text +import androidx.compose.material3.TextFieldColors +import androidx.compose.material3.TextFieldDefaults +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Shape +import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.input.VisualTransformation +import net.taler.common.Amount + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun AmountInputField( + value: String, + onValueChange: (value: String) -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + readOnly: Boolean = false, + textStyle: TextStyle = LocalTextStyle.current, + label: @Composable (() -> Unit)? = null, + leadingIcon: @Composable (() -> Unit)? = null, + trailingIcon: @Composable (() -> Unit)? = null, + supportingText: @Composable (() -> Unit)? = null, + isError: Boolean = false, + visualTransformation: VisualTransformation = VisualTransformation.None, + keyboardOptions: KeyboardOptions = KeyboardOptions.Default, + keyboardActions: KeyboardActions = KeyboardActions.Default, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + shape: Shape = TextFieldDefaults.outlinedShape, + colors: TextFieldColors = TextFieldDefaults.outlinedTextFieldColors() +) { + OutlinedTextField( + value = if (value == "0" || value.endsWith(".0")) value.trimEnd('0') else value, + onValueChange = { input -> + if (input.isNotBlank()) { + val filtered = input.filter { it.isDigit() || it == '.' }.let { + if (it == "" || it.endsWith(".")) "${it}0" else it + } + if (Amount.isValidAmountStr(filtered)) { + onValueChange(filtered) + } + } else onValueChange("0") + }, + modifier = modifier, + enabled = enabled, + readOnly = readOnly, + textStyle = textStyle, + label = label, + placeholder = { Text("0") }, + leadingIcon = leadingIcon, + trailingIcon = trailingIcon, + supportingText = supportingText, + isError = isError, + visualTransformation = visualTransformation, + keyboardOptions = keyboardOptions.copy(keyboardType = KeyboardType.Decimal), + keyboardActions = keyboardActions, + singleLine = true, + maxLines = 1, + interactionSource = interactionSource, + shape = shape, + colors = colors, + ) +}
\ No newline at end of file |