fix(@desktop/wallet): Swap modal - Pay input amount - deleting 1 decimal deletes the entire number

fixes #15818
This commit is contained in:
Khushboo Mehta 2024-07-30 11:18:15 +02:00 committed by Khushboo-dev-cpp
parent 7f046208da
commit 2447fa3554
2 changed files with 14 additions and 9 deletions

View File

@ -1788,8 +1788,10 @@ Item {
function test_deleteing_input_characters_data() { function test_deleteing_input_characters_data() {
return [ return [
{input: "0.001"}, {input: "0.001", locale: Qt.locale("en_US")},
{input: "1.00015"}, {input: "1.00015", locale: Qt.locale("en_US")},
{input: "0.001", locale: Qt.locale("pl_PL")},
{input: "1.90015", locale: Qt.locale("pl_PL")},
/* TODO uncomment after https://discord.com/channels/@me/927512790296563712/1260937239140241408 /* TODO uncomment after https://discord.com/channels/@me/927512790296563712/1260937239140241408
{input: "100.000000000000151001"}, {input: "100.000000000000151001"},
{input: "1.0200000000000151001"} */ {input: "1.0200000000000151001"} */
@ -1804,6 +1806,7 @@ Item {
const amountToSendInput = findChild(controlUnderTest, "amountToSendInput") const amountToSendInput = findChild(controlUnderTest, "amountToSendInput")
verify(!!amountToSendInput) verify(!!amountToSendInput)
amountToSendInput.input.locale = data.locale
// Launch popup // Launch popup
launchAndVerfyModal() launchAndVerfyModal()
@ -1812,9 +1815,10 @@ Item {
//TODO: should not be needed after https://github.com/status-im/status-desktop/issues/15417 //TODO: should not be needed after https://github.com/status-im/status-desktop/issues/15417
amountToSendInput.input.input.cursorPosition = data.input.length amountToSendInput.input.input.cursorPosition = data.input.length
let amountToTestInLocale = data.input.replace('.', amountToSendInput.input.locale.decimalPoint)
for(let i =0; i< data.input.length; i++) { for(let i =0; i< data.input.length; i++) {
keyClick(Qt.Key_Backspace) keyClick(Qt.Key_Backspace)
let expectedAmount = data.input.substring(0, data.input.length - (i+1)) let expectedAmount = amountToTestInLocale.substring(0, data.input.length - (i+1))
compare(amountToSendInput.input.text, expectedAmount) compare(amountToSendInput.input.text, expectedAmount)
} }
} }

View File

@ -108,15 +108,16 @@ Control {
amountToSendInput.input.input.edit.clear() amountToSendInput.input.input.edit.clear()
return return
} }
let amountToSet = SQUtils.AmountsArithmetic.fromString(tokenAmount).toFixed().replace('.', LocaleUtils.userInputLocale.decimalPoint) let amountToSet = SQUtils.AmountsArithmetic.fromString(tokenAmount).toFixed()
/* When deleting characters after a decimal point /* When deleting characters after a decimal point
eg: 0.000001 being deleted we have 0.00000 and it should not be updated to 0 eg: 0.000001 being deleted we have 0.00000 and it should not be updated to 0
and thats why we compare with toFixed() and thats why we compare with toFixed()
also when deleting a numbers last digit, we should not update the text to 0 also when deleting a numbers last digit, we should not update the text to 0
instead it should remain empty as entered by the user*/ instead it should remain empty as entered by the user */
if (SQUtils.AmountsArithmetic.fromString(amountToSendInput.input.text).toFixed() !== amountToSet && let currentInputTextAmount = SQUtils.AmountsArithmetic.fromString(amountToSendInput.input.text.replace(amountToSendInput.input.locale.decimalPoint,'.')).toFixed()
if (currentInputTextAmount !== amountToSet &&
!(amountToSet === "0" && !amountToSendInput.input.text)) { !(amountToSet === "0" && !amountToSendInput.input.text)) {
amountToSendInput.input.text = amountToSet amountToSendInput.input.text = amountToSet.replace('.', amountToSendInput.input.locale.decimalPoint)
} }
} }
} }
@ -264,13 +265,13 @@ Control {
readonly property double maxSafeValue: WalletUtils.calculateMaxSafeSendAmount( readonly property double maxSafeValue: WalletUtils.calculateMaxSafeSendAmount(
d.maxInputBalance, d.inputSymbol) d.maxInputBalance, d.inputSymbol)
readonly property string maxSafeValueAsString: maxSafeValue.toLocaleString( readonly property string maxSafeValueAsString: maxSafeValue.toLocaleString(
LocaleUtils.userInputLocale, 'f', -128) amountToSendInput.input.locale, 'f', -128)
markAsInvalid: (!amountToSendInput.input.valid && !!amountToSendInput.input.text) markAsInvalid: (!amountToSendInput.input.valid && !!amountToSendInput.input.text)
|| d.maxInputBalance === 0 || d.maxInputBalance === 0
formattedValue: formattedValue:
d.maxInputBalance === 0 ? LocaleUtils.userInputLocale.zeroDigit d.maxInputBalance === 0 ? amountToSendInput.input.locale.zeroDigit
: root.currencyStore.formatCurrencyAmount( : root.currencyStore.formatCurrencyAmount(
maxSafeValue, d.inputSymbol, maxSafeValue, d.inputSymbol,
{ noSymbol: !amountToSendInput.inputIsFiat }) { noSymbol: !amountToSendInput.inputIsFiat })