226 lines
7.2 KiB
QML
226 lines
7.2 KiB
QML
import QtQuick 2.13
|
|
import QtQuick.Controls 2.13
|
|
import QtQuick.Layouts 1.13
|
|
import "../imports"
|
|
import "./"
|
|
|
|
Item {
|
|
id: root
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
height: sliderWrapper.height + Style.current.smallPadding + txtNetworkFee.height + buttonAdvanced.height
|
|
property string validationError: "Please enter a number"
|
|
property double slowestGasPrice: 0
|
|
property double fastestGasPrice: 100
|
|
property double stepSize: ((root.fastestGasPrice - root.slowestGasPrice) / 10).toFixed(1)
|
|
property var getGasEthValue: function () {}
|
|
property var getFiatValue: function () {}
|
|
property string defaultCurrency: "USD"
|
|
property alias selectedGasPrice: inputGasPrice.text
|
|
property alias selectedGasLimit: inputGasLimit.text
|
|
|
|
function defaultGasPrice() {
|
|
return ((50 * (root.fastestGasPrice - root.slowestGasPrice) / 100) + root.slowestGasPrice)
|
|
}
|
|
|
|
function updateGasEthValue() {
|
|
// causes error on application load without this null check
|
|
if (!inputGasPrice || !inputGasLimit) {
|
|
return
|
|
}
|
|
let ethValue = root.getGasEthValue(inputGasPrice.text, inputGasLimit.text)
|
|
let fiatValue = root.getFiatValue(ethValue, "ETH", root.defaultCurrency)
|
|
let summary = Utils.stripTrailingZeros(ethValue) + " ETH ~" + fiatValue + " " + root.defaultCurrency.toUpperCase()
|
|
labelGasPriceSummary.text = summary
|
|
labelGasPriceSummaryAdvanced.text = summary
|
|
}
|
|
|
|
function validate(value) {
|
|
return !isNaN(value)
|
|
}
|
|
|
|
StyledText {
|
|
id: txtNetworkFee
|
|
anchors.top: parent.top
|
|
anchors.left: parent.left
|
|
text: qsTr("Network fee")
|
|
font.weight: Font.Medium
|
|
font.pixelSize: 13
|
|
color: Style.current.textColor
|
|
}
|
|
|
|
StyledText {
|
|
id: labelGasPriceSummary
|
|
anchors.top: parent.top
|
|
anchors.right: parent.right
|
|
font.weight: Font.Medium
|
|
font.pixelSize: 13
|
|
color: Style.current.secondaryText
|
|
}
|
|
|
|
Item {
|
|
id: sliderWrapper
|
|
anchors.topMargin: Style.current.smallPadding
|
|
anchors.top: labelGasPriceSummary.bottom
|
|
height: sliderWrapper.visible ? gasSlider.height + labelSlow.height + Style.current.padding : 0
|
|
width: parent.width
|
|
visible: Number(root.selectedGasPrice) >= Number(root.slowestGasPrice) && Number(root.selectedGasPrice) <= Number(root.fastestGasPrice)
|
|
|
|
StatusSlider {
|
|
id: gasSlider
|
|
minimumValue: root.slowestGasPrice
|
|
maximumValue: root.fastestGasPrice
|
|
stepSize: root.stepSize
|
|
value: root.defaultGasPrice()
|
|
onValueChanged: {
|
|
if (!isNaN(gasSlider.value)) {
|
|
inputGasPrice.text = gasSlider.value + ""
|
|
root.updateGasEthValue()
|
|
}
|
|
}
|
|
visible: parent.visible
|
|
}
|
|
|
|
StyledText {
|
|
id: labelSlow
|
|
anchors.top: gasSlider.bottom
|
|
anchors.topMargin: Style.current.padding
|
|
anchors.left: parent.left
|
|
text: qsTr("Slow")
|
|
font.pixelSize: 15
|
|
color: Style.current.textColor
|
|
visible: parent.visible
|
|
}
|
|
|
|
StyledText {
|
|
id: labelOptimal
|
|
anchors.top: gasSlider.bottom
|
|
anchors.topMargin: Style.current.padding
|
|
anchors.horizontalCenter: gasSlider.horizontalCenter
|
|
text: qsTr("Optimal")
|
|
font.pixelSize: 15
|
|
color: Style.current.textColor
|
|
visible: parent.visible
|
|
}
|
|
|
|
StyledText {
|
|
id: labelFast
|
|
anchors.top: gasSlider.bottom
|
|
anchors.topMargin: Style.current.padding
|
|
anchors.right: parent.right
|
|
text: qsTr("Fast")
|
|
font.pixelSize: 15
|
|
color: Style.current.textColor
|
|
visible: parent.visible
|
|
}
|
|
}
|
|
|
|
StyledButton {
|
|
id: buttonReset
|
|
anchors.top: sliderWrapper.bottom
|
|
anchors.topMargin: sliderWrapper.visible ? Style.current.smallPadding : 0
|
|
anchors.right: buttonAdvanced.left
|
|
anchors.rightMargin: -Style.current.padding
|
|
label: qsTr("Reset")
|
|
btnColor: "transparent"
|
|
textSize: 13
|
|
visible: !sliderWrapper.visible
|
|
onClicked: {
|
|
gasSlider.value = root.defaultGasPrice()
|
|
inputGasPrice.text = root.defaultGasPrice()
|
|
}
|
|
}
|
|
|
|
StyledButton {
|
|
id: buttonAdvanced
|
|
anchors.top: sliderWrapper.bottom
|
|
anchors.topMargin: sliderWrapper.visible ? Style.current.smallPadding : 0
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: -Style.current.padding
|
|
label: qsTr("Advanced")
|
|
btnColor: "transparent"
|
|
textSize: 13
|
|
onClicked: {
|
|
customNetworkFeeDialog.open()
|
|
}
|
|
}
|
|
|
|
ModalPopup {
|
|
id: customNetworkFeeDialog
|
|
title: qsTr("Custom Network Fee")
|
|
height: 286
|
|
width: 400
|
|
|
|
Input {
|
|
id: inputGasLimit
|
|
label: qsTr("Gas limit")
|
|
text: "22000"
|
|
customHeight: 56
|
|
anchors.top: parent.top
|
|
anchors.left: parent.left
|
|
anchors.right: inputGasPrice.left
|
|
anchors.rightMargin: Style.current.padding
|
|
onTextChanged: {
|
|
if (root.validate(inputGasLimit.text.trim())) {
|
|
inputGasLimit.validationError = ""
|
|
root.updateGasEthValue()
|
|
return
|
|
}
|
|
inputGasLimit.validationError = root.validationError
|
|
}
|
|
}
|
|
|
|
Input {
|
|
id: inputGasPrice
|
|
label: qsTr("Gas price")
|
|
anchors.top: parent.top
|
|
anchors.left: undefined
|
|
anchors.right: parent.right
|
|
width: 130
|
|
customHeight: 56
|
|
text: root.defaultGasPrice()
|
|
onTextChanged: {
|
|
if (root.validate(inputGasPrice.text.trim())) {
|
|
inputGasPrice.validationError = ""
|
|
root.updateGasEthValue()
|
|
return
|
|
}
|
|
inputGasPrice.validationError = root.validationError
|
|
}
|
|
|
|
StyledText {
|
|
color: Style.current.darkGrey
|
|
text: qsTr("Gwei")
|
|
anchors.top: parent.top
|
|
anchors.topMargin: 42
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: Style.current.padding
|
|
font.pixelSize: 15
|
|
}
|
|
}
|
|
|
|
StyledText {
|
|
id: labelGasPriceSummaryAdvanced
|
|
anchors.bottom: parent.bottom
|
|
anchors.bottomMargin: Style.current.smallPadding
|
|
anchors.right: parent.right
|
|
font.weight: Font.Medium
|
|
font.pixelSize: 13
|
|
color: Style.current.secondaryText
|
|
}
|
|
|
|
footer: StyledButton {
|
|
id: applyButton
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: Style.current.smallPadding
|
|
label: qsTr("Apply")
|
|
disabled: !root.validate(inputGasLimit.text.trim()) || !root.validate(inputGasPrice.text.trim())
|
|
anchors.bottom: parent.bottom
|
|
onClicked: {
|
|
root.updateGasEthValue()
|
|
customNetworkFeeDialog.close()
|
|
}
|
|
}
|
|
}
|
|
}
|