fix(@desktop/wallet): fix send input for some locales

Fixes #9324
This commit is contained in:
Dario Gabriel Lipicar 2023-03-08 16:35:18 -03:00 committed by dlipicar
parent ab523ee19f
commit 2fb158b810
7 changed files with 28 additions and 24 deletions

View File

@ -1,6 +1,7 @@
import QtQuick 2.14
import StatusQ.Controls 0.1
import StatusQ.Core 0.1
/*!
\qmltype StatusFloatValidator
@ -53,8 +54,9 @@ StatusValidator {
name: "floatValidator"
errorMessage: qsTr("Please enter a valid numeric value.")
validate: function (t) {
return !isNaN(t) && t >= bottom && t <= top ? true : {
validate: function (tStr) {
var t = LocaleUtils.numberFromLocaleString(tStr, root.locale)
return !isNaN(t) && t >= bottom && t <= top ? true : {
bottom: bottom,
top: top,
actual: t

View File

@ -53,7 +53,7 @@ QtObject {
try {
return Number.fromLocaleString(locale, num)
} catch (_) {
return parseFloat(num)
return NaN
}
}
@ -78,7 +78,7 @@ QtObject {
if (typeof(currencyAmount) !== "object") {
console.warn("Wrong type for currencyAmount: " + JSON.stringify(currencyAmount))
console.trace()
return NaN
return "N/A"
}
// Parse options

View File

@ -63,11 +63,13 @@ Input {
return
}
try {
d.amount = LocaleUtils.numberFromLocaleString(text) || 0
let amount = LocaleUtils.numberFromLocaleString(text)
if (isNaN(amount)) {
d.amount = 0
root.validationError = qsTr("Invalid amount format")
} else {
d.amount = amount
root.validationError = ""
} catch (err) {
root.validationError = qsTr("Invalid amount format")
}
}

View File

@ -68,7 +68,7 @@ StatusDialog {
}
property var recalculateRoutesAndFees: Backpressure.debounce(popup, 600, function() {
if(!!popup.selectedAccount && !!assetSelector.selectedAsset && d.recipientReady && amountToSendInput.input.valid) {
if(!!popup.selectedAccount && !!assetSelector.selectedAsset && d.recipientReady && amountToSendInput.inputNumberValid) {
popup.isLoading = true
let amount = Math.round(amountToSendInput.cryptoValueToSend * Math.pow(10, assetSelector.selectedAsset.decimals))
popup.store.suggestedRoutes(popup.selectedAccount.address, amount.toString(16), assetSelector.selectedAsset.symbol,
@ -87,7 +87,7 @@ StatusDialog {
readonly property double maxInputBalance: amountToSendInput.inputIsFiat ? maxFiatBalance : maxCryptoBalance
readonly property string selectedSymbol: !!assetSelector.selectedAsset ? assetSelector.selectedAsset.symbol : ""
readonly property string inputSymbol: amountToSendInput.inputIsFiat ? popup.store.currentCurrency : selectedSymbol
readonly property bool errorMode: popup.isLoading || !recipientReady ? false : errorType !== Constants.NoError || networkSelector.errorMode || isNaN(amountToSendInput.input.text)
readonly property bool errorMode: popup.isLoading || !recipientReady ? false : errorType !== Constants.NoError || networkSelector.errorMode || !amountToSendInput.inputNumberValid
readonly property bool recipientReady: (isAddressValid || isENSValid) && !recipientSelector.isPending
property bool isAddressValid: Utils.isValidAddress(popup.addressText)
property bool isENSValid: false
@ -253,7 +253,7 @@ StatusDialog {
return RootStore.getNetworkIcon(chainId)
}
onSelectedAssetChanged: {
if (!assetSelector.selectedAsset || !amountToSendInput.input.text || isNaN(amountToSendInput.input.text)) {
if (!assetSelector.selectedAsset || !amountToSendInput.inputNumberValid) {
return
}
popup.recalculateRoutesAndFees()
@ -300,7 +300,7 @@ StatusDialog {
id: amountToReceive
Layout.alignment: Qt.AlignRight
Layout.fillWidth:true
visible: popup.bestRoutes !== undefined && popup.bestRoutes.length > 0 && !!amountToSendInput.input.text && amountToSendInput.input.valid
visible: popup.bestRoutes !== undefined && popup.bestRoutes.length > 0 && amountToSendInput.inputNumberValid
store: popup.store
isLoading: popup.isLoading
selectedSymbol: d.selectedSymbol
@ -462,7 +462,7 @@ StatusDialog {
requiredGasInEth: d.totalFeesInEth
selectedAsset: assetSelector.selectedAsset
onReCalculateSuggestedRoute: popup.recalculateRoutesAndFees()
visible: d.recipientReady && !!assetSelector.selectedAsset && !!amountToSendInput.input.text
visible: d.recipientReady && !!assetSelector.selectedAsset && amountToSendInput.inputNumberValid
errorType: d.errorType
isLoading: popup.isLoading
bestRoutes: popup.bestRoutes
@ -476,7 +476,7 @@ StatusDialog {
anchors.right: parent.right
anchors.leftMargin: Style.current.bigPadding
anchors.rightMargin: Style.current.bigPadding
visible: d.recipientReady && !!assetSelector.selectedAsset && networkSelector.advancedOrCustomMode && !!amountToSendInput.input.text
visible: d.recipientReady && !!assetSelector.selectedAsset && networkSelector.advancedOrCustomMode && amountToSendInput.inputNumberValid
selectedTokenSymbol: d.selectedSymbol
isLoading: popup.isLoading
bestRoutes: popup.bestRoutes
@ -494,7 +494,7 @@ StatusDialog {
maxFiatFees: popup.isLoading ? "..." : popup.currencyStore.formatCurrencyAmount(d.totalFeesInFiat, popup.store.currentCurrency)
totalTimeEstimate: popup.isLoading? "..." : d.totalTimeEstimate
pending: d.isPendingTx || popup.isLoading
visible: d.recipientReady && amountToSendInput.cryptoValueToSend >= 0 && !d.errorMode && !!amountToSendInput.input.text && amountToSendInput.input.valid
visible: d.recipientReady && amountToSendInput.inputNumberValid && !d.errorMode
onNextButtonClicked: popup.sendTransaction()
}

View File

@ -981,6 +981,9 @@ QtObject {
}
function formatCurrencyAmount(amount, symbol, options = null, locale = null) {
if (isNaN(amount)) {
return "N/A"
}
var currencyAmount = getCurrencyAmount(amount, symbol)
return LocaleUtils.currencyAmountToLocaleString(currencyAmount, options, locale)
}

View File

@ -13,7 +13,8 @@ ColumnLayout {
id: root
property alias input: topAmountToSendInput
readonly property double inputNumber: topAmountToSendInput.text ? LocaleUtils.numberFromLocaleString(topAmountToSendInput.text) : 0
readonly property bool inputNumberValid: !!input.text && !isNaN(d.inputNumber)
readonly property double inputNumber: inputNumberValid ? d.inputNumber : 0
readonly property int minSendCryptoDecimals: !inputIsFiat ? LocaleUtils.fractionalPartLength(inputNumber) : 0
readonly property int minReceiveCryptoDecimals: !inputIsFiat ? minSendCryptoDecimals + 1 : 0
readonly property int minSendFiatDecimals: inputIsFiat ? LocaleUtils.fractionalPartLength(inputNumber) : 0
@ -34,7 +35,7 @@ ColumnLayout {
}
delayed: true
}
property var fiatValueToSend
property double fiatValueToSend
Binding {
target: root
property: "fiatValueToSend"
@ -54,6 +55,7 @@ ColumnLayout {
QtObject {
id: d
readonly property string zeroString: LocaleUtils.numberToLocaleString(0, 2)
readonly property double inputNumber: LocaleUtils.numberFromLocaleString(topAmountToSendInput.text)
property Timer waitTimer: Timer {
interval: 1000
onTriggered: reCalculateSuggestedRoute()
@ -100,8 +102,8 @@ ColumnLayout {
font: topAmountToSendInput.input.placeholder.font
}
Keys.onReleased: {
const amount = topAmountToSendInput.text.trim()
if (!Utils.containsOnlyDigits(amount) || isNaN(amount)) {
const amount = LocaleUtils.numberFromLocaleString(topAmountToSendInput.text)
if (isNaN(amount)) {
return
}
d.waitTimer.restart()

View File

@ -572,11 +572,6 @@ QtObject {
return JSON.stringify({imagePath: String(imgPath).replace("file://", ""), cropRect: cropRect})
}
function containsOnlyDigits(msg) {
var reg = new RegExp('[+-]?([0-9]*[.])?[0-9]+')
return reg.test(msg)
}
function addSocialLinkPrefix(link, type) {
const prefix = Constants.socialLinkPrefixesByType[type]
if (link.startsWith(prefix))