summaryrefslogtreecommitdiff
path: root/wallet/src/main/java/net/taler/wallet/compose/AmountInputField.kt
diff options
context:
space:
mode:
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.kt89
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