From f25392379ead27d30f31f6bcb2930d7f762f0629 Mon Sep 17 00:00:00 2001 From: sneurlax <sneurlax@gmail.com> Date: Thu, 26 Jan 2023 10:46:53 -0600 Subject: [PATCH] validate min and max amounts --- lib/pages/buy_view/buy_form.dart | 48 +++++++++++++++++++++++--------- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/lib/pages/buy_view/buy_form.dart b/lib/pages/buy_view/buy_form.dart index 8259afd9c..4dc13aeda 100644 --- a/lib/pages/buy_view/buy_form.dart +++ b/lib/pages/buy_view/buy_form.dart @@ -819,7 +819,7 @@ class _BuyFormState extends ConsumerState<BuyForm> { style: STextStyles.smallMed14(context).copyWith( color: Theme.of(context).extension<StackColors>()!.textDark, ), - key: const Key("amountInputFieldCryptoTextFieldKey"), + key: const Key("buyAmountInputFieldTextFieldKey"), controller: _buyAmountController, focusNode: _buyAmountFocusNode, keyboardType: Util.isDesktop @@ -832,18 +832,8 @@ class _BuyFormState extends ConsumerState<BuyForm> { inputFormatters: [ // regex to validate a crypto amount with 8 decimal places or // 2 if fiat - TextInputFormatter.withFunction( - (oldValue, newValue) { - final regexString = buyWithFiat - ? r'^([0-9]*[,.]?[0-9]{0,2}|[,.][0-9]{0,2})$' - : r'^([0-9]*[,.]?[0-9]{0,8}|[,.][0-9]{0,8})$'; - - // return RegExp(r'^([0-9]*[,.]?[0-9]{0,8}|[,.][0-9]{0,8})$') - return RegExp(regexString).hasMatch(newValue.text) - ? newValue - : oldValue; - }, - ), + NumericalRangeFormatter( + min: minFiat, max: maxFiat, buyWithFiat: buyWithFiat) ], decoration: InputDecoration( contentPadding: const EdgeInsets.only( @@ -1255,3 +1245,35 @@ class _BuyFormState extends ConsumerState<BuyForm> { ); } } + +// See https://stackoverflow.com/a/68072967 +class NumericalRangeFormatter extends TextInputFormatter { + final Decimal min; + final Decimal max; + final bool buyWithFiat; + + NumericalRangeFormatter( + {required this.min, required this.max, required this.buyWithFiat}); + + @override + TextEditingValue formatEditUpdate( + TextEditingValue oldValue, + TextEditingValue newValue, + ) { + if (newValue.text == '') { + return newValue; + } else if (Decimal.parse(newValue.text) < min) { + newValue = + const TextEditingValue().copyWith(text: min.toStringAsFixed(2)); + } else { + newValue = Decimal.parse(newValue.text) > max ? oldValue : newValue; + } + + final regexString = buyWithFiat + ? r'^([0-9]*[,.]?[0-9]{0,2}|[,.][0-9]{0,2})$' + : r'^([0-9]*[,.]?[0-9]{0,8}|[,.][0-9]{0,8})$'; + + // return RegExp(r'^([0-9]*[,.]?[0-9]{0,8}|[,.][0-9]{0,8})$') + return RegExp(regexString).hasMatch(newValue.text) ? newValue : oldValue; + } +}