mirror of
https://github.com/status-im/status-desktop.git
synced 2025-01-15 00:55:22 +00:00
d8b0145eb3
Add gas estimate for sticker pack purchase. Update transaction for sticker pack purchase. Add GasValidator component which validates gas is selected correctly and displays an error message if not. This component is not visible until it is not valid (at which point the valdiation error message is displayed). In a future PR, need to: 1. estimate gas for token txfer (sendTransaction) via a normalised method for estimating gas for EthSend 2. move sticker pack purchase to use an EthSend object so gas can be estimated and tx sent
275 lines
9.1 KiB
QML
275 lines
9.1 KiB
QML
import QtQuick 2.13
|
|
import QtQuick.Controls 2.13
|
|
import QtQuick.Layouts 1.13
|
|
import QtGraphicalEffects 1.13
|
|
import "../imports"
|
|
|
|
Item {
|
|
id: root
|
|
//% "Choose account"
|
|
property string label: qsTrId("choose-account")
|
|
property bool showAccountDetails: true
|
|
property var accounts
|
|
property var selectedAccount
|
|
property string currency: "usd"
|
|
height: select.height +
|
|
(selectedAccountDetails.visible ? selectedAccountDetails.height : 0)
|
|
// set to asset symbol to display asset's balance top right
|
|
// NOTE: if this asset is not selected as a wallet token in the UI, then
|
|
// nothing will be displayed
|
|
property string showBalanceForAssetSymbol: ""
|
|
property var assetFound
|
|
property double minRequiredAssetBalance: 0
|
|
property int dropdownWidth: width
|
|
property alias dropdownAlignment: select.menuAlignment
|
|
property bool isValid: true
|
|
property var reset: function() {}
|
|
|
|
function resetInternal() {
|
|
accounts = undefined
|
|
selectedAccount = undefined
|
|
showBalanceForAssetSymbol = ""
|
|
minRequiredAssetBalance = 0
|
|
assetFound = undefined
|
|
isValid = true
|
|
}
|
|
|
|
function validate() {
|
|
if (showBalanceForAssetSymbol == "" || minRequiredAssetBalance == 0 || !assetFound) {
|
|
return root.isValid
|
|
}
|
|
root.isValid = assetFound.value > minRequiredAssetBalance
|
|
return root.isValid
|
|
}
|
|
|
|
onSelectedAccountChanged: {
|
|
if (!selectedAccount) {
|
|
return
|
|
}
|
|
if (selectedAccount.iconColor) {
|
|
selectedIconImgOverlay.color = selectedAccount.iconColor
|
|
}
|
|
if (selectedAccount.name) {
|
|
selectedTextField.text = selectedAccount.name
|
|
}
|
|
if (selectedAccount.address) {
|
|
textSelectedAddress.text = selectedAccount.address + " • "
|
|
}
|
|
if (selectedAccount.fiatBalance) {
|
|
textSelectedAddressFiatBalance.text = selectedAccount.fiatBalance + " " + currency.toUpperCase()
|
|
}
|
|
if (selectedAccount.assets && showBalanceForAssetSymbol) {
|
|
assetFound = Utils.findAssetBySymbol(selectedAccount.assets, showBalanceForAssetSymbol)
|
|
if (!assetFound) {
|
|
console.warn(qsTr("Cannot find asset '%1'. Ensure this asset has been added to the token list.").arg(showBalanceForAssetSymbol))
|
|
}
|
|
}
|
|
validate()
|
|
}
|
|
|
|
onAssetFoundChanged: {
|
|
if (!assetFound) {
|
|
return
|
|
}
|
|
txtAssetBalance.text = "Balance: " + (parseFloat(assetFound.value) === 0.0 ? "0" : Utils.stripTrailingZeros(assetFound.value)) + " " + assetFound.symbol
|
|
}
|
|
|
|
StyledText {
|
|
id: txtAssetBalance
|
|
visible: root.assetFound !== undefined
|
|
anchors.bottom: select.top
|
|
anchors.bottomMargin: -18
|
|
anchors.right: parent.right
|
|
|
|
color: !root.isValid ? Style.current.danger : Style.current.secondaryText
|
|
font.pixelSize: 13
|
|
height: 18
|
|
}
|
|
Select {
|
|
id: select
|
|
label: root.label
|
|
model: root.accounts
|
|
menuAlignment: Select.MenuAlignment.Left
|
|
menu.delegate: menuItem
|
|
menu.onOpened: {
|
|
selectedAccountDetails.visible = false
|
|
}
|
|
menu.onClosed: {
|
|
selectedAccountDetails.visible = root.showAccountDetails
|
|
}
|
|
menu.width: dropdownWidth
|
|
selectedItemView: Item {
|
|
anchors.fill: parent
|
|
|
|
SVGImage {
|
|
id: selectedIconImg
|
|
sourceSize.height: 12
|
|
sourceSize.width: 12
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: Style.current.padding
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
fillMode: Image.PreserveAspectFit
|
|
source: "../app/img/walletIcon.svg"
|
|
}
|
|
ColorOverlay {
|
|
id: selectedIconImgOverlay
|
|
anchors.fill: selectedIconImg
|
|
source: selectedIconImg
|
|
}
|
|
|
|
StyledText {
|
|
id: selectedTextField
|
|
elide: Text.ElideRight
|
|
anchors.left: selectedIconImg.right
|
|
anchors.leftMargin: 8
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: select.selectedItemRightMargin
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
font.pixelSize: 15
|
|
verticalAlignment: Text.AlignVCenter
|
|
height: 22
|
|
}
|
|
}
|
|
}
|
|
|
|
Row {
|
|
id: selectedAccountDetails
|
|
visible: root.showAccountDetails
|
|
anchors.top: select.bottom
|
|
anchors.topMargin: 8
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: 2
|
|
|
|
StyledText {
|
|
id: textSelectedAddress
|
|
font.pixelSize: 12
|
|
elide: Text.ElideMiddle
|
|
height: 16
|
|
width: 90
|
|
color: Style.current.secondaryText
|
|
}
|
|
StyledText {
|
|
id: textSelectedAddressFiatBalance
|
|
font.pixelSize: 12
|
|
height: 16
|
|
color: Style.current.secondaryText
|
|
}
|
|
}
|
|
|
|
Component {
|
|
id: menuItem
|
|
MenuItem {
|
|
id: itemContainer
|
|
property bool isFirstItem: index === 0
|
|
property bool isLastItem: index === accounts.rowCount() - 1
|
|
|
|
Component.onCompleted: {
|
|
if (!root.selectedAccount && isFirstItem) {
|
|
root.selectedAccount = { address, name, iconColor, assets, fiatBalance }
|
|
}
|
|
}
|
|
|
|
height: accountName.height + 14 + accountAddress.height + 14
|
|
SVGImage {
|
|
id: iconImg
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: Style.current.padding
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
width: 12
|
|
height: 12
|
|
sourceSize.height: height
|
|
sourceSize.width: width
|
|
fillMode: Image.PreserveAspectFit
|
|
source: "../app/img/walletIcon.svg"
|
|
}
|
|
ColorOverlay {
|
|
anchors.fill: iconImg
|
|
source: iconImg
|
|
color: iconColor
|
|
}
|
|
Column {
|
|
id: column
|
|
anchors.left: iconImg.right
|
|
anchors.leftMargin: 14
|
|
anchors.right: txtFiatBalance.left
|
|
anchors.rightMargin: 8
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
|
|
StyledText {
|
|
id: accountName
|
|
text: name
|
|
elide: Text.ElideRight
|
|
font.pixelSize: 15
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
height: 22
|
|
}
|
|
|
|
StyledText {
|
|
id: accountAddress
|
|
text: address
|
|
elide: Text.ElideMiddle
|
|
width: 80
|
|
color: Style.current.secondaryText
|
|
font.pixelSize: 12
|
|
height: 16
|
|
}
|
|
}
|
|
StyledText {
|
|
id: txtFiatBalance
|
|
anchors.right: fiatCurrencySymbol.left
|
|
anchors.rightMargin: 4
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
font.pixelSize: 15
|
|
height: 22
|
|
text: fiatBalance
|
|
}
|
|
StyledText {
|
|
id: fiatCurrencySymbol
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: Style.current.padding
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
font.pixelSize: 15
|
|
height: 22
|
|
color: Style.current.secondaryText
|
|
text: root.currency.toUpperCase()
|
|
}
|
|
background: Rectangle {
|
|
color: itemContainer.highlighted ? Style.current.backgroundHover : Style.current.background
|
|
radius: Style.current.radius
|
|
|
|
// cover bottom left/right corners with square corners
|
|
Rectangle {
|
|
visible: !isLastItem
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.bottom: parent.bottom
|
|
height: parent.radius
|
|
color: parent.color
|
|
}
|
|
|
|
// cover top left/right corners with square corners
|
|
Rectangle {
|
|
visible: !isFirstItem
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.top: parent.top
|
|
height: parent.radius
|
|
color: parent.color
|
|
}
|
|
}
|
|
MouseArea {
|
|
cursorShape: Qt.PointingHandCursor
|
|
anchors.fill: itemContainer
|
|
onClicked: {
|
|
root.selectedAccount = { address, name, iconColor, assets, fiatBalance }
|
|
select.menu.close()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|