status-desktop/ui/imports/shared/status/StatusETHTransactionModal.qml

258 lines
9.7 KiB
QML
Raw Normal View History

import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQuick.Layouts 1.13
import QtQuick.Dialogs 1.3
import utils 1.0
import StatusQ.Controls 0.1
import shared.views 1.0
import shared.popups 1.0
import shared.stores 1.0
import shared.controls 1.0
// TODO: replace with StatusModal
ModalPopup {
id: root
readonly property var asset: {"name": "Ethereum", "symbol": "ETH"}
2021-08-09 22:23:52 +00:00
title: qsTr("Contract interaction")
2021-08-09 22:23:52 +00:00
property var estimateGasFunction: (function(userAddress) { return 0; })
property var onSendTransaction: (function(userAddress, gasLimit, gasPrice, password){ return ""; })
property var onSuccess: (function(){})
Component.onCompleted: {
// Not Refactored Yet
// RootStore.walletModelInst.gasView.getGasPricePredictions()
}
2021-07-05 12:34:56 +00:00
height: 540
2021-08-09 22:23:52 +00:00
function sendTransaction() {
// Not Refactored Yet
// try {
// let responseStr = RootStore.profileModelInst.ens.setPubKey(root.ensUsername,
// selectFromAccount.selectedAccount.address,
// gasSelector.selectedGasLimit,
// gasSelector.eip1599Enabled ? "" : gasSelector.selectedGasPrice,
// gasSelector.selectedTipLimit,
// gasSelector.selectedOverallLimit,
// transactionSigner.enteredPassword)
// let response = JSON.parse(responseStr)
// if (!response.success) {
// if (Utils.isInvalidPasswordMessage(response.result)){
// //% "Wrong password"
// transactionSigner.validationError = qsTrId("wrong-password")
// return
// }
// sendingError.text = response.result
// return sendingError.open()
// }
// onSuccess();
// root.close();
// } catch (e) {
// console.error('Error sending the transaction', e)
// sendingError.text = "Error sending the transaction: " + e.message;
// return sendingError.open()
// }
}
2021-08-09 22:23:52 +00:00
property MessageDialog sendingError: MessageDialog {
id: sendingError
//% "Error sending the transaction"
title: qsTrId("error-sending-the-transaction")
icon: StandardIcon.Critical
standardButtons: StandardButton.Ok
}
TransactionStackView {
id: stack
height: parent.height
anchors.fill: parent
anchors.leftMargin: Style.current.padding
anchors.rightMargin: Style.current.padding
onGroupActivated: {
root.title = group.headerText
btnNext.text = group.footerText
}
TransactionFormGroup {
id: group1
2021-08-09 22:23:52 +00:00
headerText: root.title
2020-09-23 20:49:15 +00:00
//% "Continue"
footerText: qsTrId("continue")
StatusAccountSelector {
id: selectFromAccount
2021-11-19 09:42:41 +00:00
accounts: walletSectionAccounts.model
selectedAccount: {
2021-11-19 09:42:41 +00:00
const currAcc = walletSectionCurrent
if (currAcc.walletType !== Constants.watchWalletType) {
return currAcc
}
return null
}
// Not Refactored Yet
// currency: RootStore.defaultCurrency
width: stack.width
2020-09-23 20:49:15 +00:00
//% "Choose account"
label: qsTrId("choose-account")
showBalanceForAssetSymbol: "ETH"
minRequiredAssetBalance: 0
onSelectedAccountChanged: if (isValid) { gasSelector.estimateGas() }
}
RecipientSelector {
id: selectRecipient
visible: false
// Not Refactored Yet
// ensModule: root.store.contactsModuleInst
// accounts: RootStore.walletModelInst.accountsView.accounts
contacts: RootStore.contactsModuleInst.model.addedContacts
selectedRecipient: { "address": RootStore.utilsModelInst.ensRegisterAddress, "type": RecipientSelector.Type.Address }
readOnly: true
currentIndex: index
onSelectedRecipientChanged: if (isValid) { gasSelector.estimateGas() }
}
GasSelector {
id: gasSelector
visible: true
anchors.top: selectFromAccount.bottom
anchors.topMargin: Style.current.padding
// Not Refactored Yet
// gasPrice: parseFloat(RootStore.gasPrice)
// getGasEthValue: RootStore.gasEthValue
// getFiatValue: RootStore.fiatValue
// defaultCurrency: RootStore.defaultCurrency
2021-07-05 12:34:56 +00:00
property var estimateGas: Backpressure.debounce(gasSelector, 600, function() {
2021-08-09 22:23:52 +00:00
let estimatedGas = root.estimateGasFunction(selectFromAccount.selectedAccount);
gasSelector.selectedGasLimit = estimatedGas
return estimatedGas;
})
}
GasValidator {
id: gasValidator
anchors.top: gasSelector.bottom
selectedAccount: selectFromAccount.selectedAccount
selectedAsset: root.asset
selectedAmount: 0
selectedGasEthValue: gasSelector.selectedGasEthValue
}
}
TransactionFormGroup {
id: group3
2021-08-09 22:23:52 +00:00
headerText: root.title
2020-09-23 20:49:15 +00:00
//% "Sign with password"
footerText: qsTrId("sign-with-password")
TransactionPreview {
id: pvwTransaction
width: stack.width
fromAccount: selectFromAccount.selectedAccount
gas: {
"value": gasSelector.selectedGasEthValue,
"symbol": "ETH",
"fiatValue": gasSelector.selectedGasFiatValue
}
toAccount: selectRecipient.selectedRecipient
asset: root.asset
// Not Refactored Yet
// currency: RootStore.defaultCurrency
// amount: {
// const fiatValue = RootStore.walletModelInst.balanceView.getFiatValue(0, root.asset.symbol, currency)
// return { "value": 0, "fiatValue": fiatValue }
// }
}
}
TransactionFormGroup {
id: group4
2021-08-09 22:23:52 +00:00
headerText: root.title
2020-09-23 20:49:15 +00:00
//% "Sign with password"
footerText: qsTrId("sign-with-password")
TransactionSigner {
id: transactionSigner
width: stack.width
// Not Refactored Yet
// signingPhrase: RootStore.walletModelInst.utilsView.signingPhrase
}
}
}
footer: Item {
width: parent.width
height: btnNext.height
2021-08-09 22:23:52 +00:00
StatusRoundButton {
2021-08-09 22:23:52 +00:00
id: btnBack
anchors.left: parent.left
icon.name: "arrow-right"
icon.width: 20
icon.height: 16
icon.rotation: 180
2021-08-09 22:23:52 +00:00
visible: stack.currentGroup.showBackBtn
enabled: stack.currentGroup.isValid || stack.isLastGroup
onClicked: {
if (typeof stack.currentGroup.onBackClicked === "function") {
return stack.currentGroup.onBackClicked()
}
stack.back()
}
}
2021-07-05 12:34:56 +00:00
Component {
id: transactionSettingsConfirmationPopupComponent
TransactionSettingsConfirmationPopup {
}
}
StatusButton {
id: btnNext
anchors.right: parent.right
2020-09-23 20:49:15 +00:00
//% "Next"
text: qsTrId("next")
enabled: stack.currentGroup.isValid
onClicked: {
const validity = stack.currentGroup.validate()
if (validity.isValid && !validity.isPending) {
if (stack.isLastGroup) {
return root.sendTransaction()
}
2021-07-05 12:34:56 +00:00
if(gasSelector.eip1599Enabled && stack.currentGroup === group2 && gasSelector.advancedMode){
if(gasSelector.showPriceLimitWarning || gasSelector.showTipLimitWarning){
Global.openPopup(transactionSettingsConfirmationPopupComponent, {
2021-07-05 12:34:56 +00:00
currentBaseFee: gasSelector.latestBaseFeeGwei,
currentMinimumTip: gasSelector.perGasTipLimitFloor,
currentAverageTip: gasSelector.perGasTipLimitAverage,
tipLimit: gasSelector.selectedTipLimit,
suggestedTipLimit: gasSelector.perGasTipLimitFloor,
priceLimit: gasSelector.selectedOverallLimit,
suggestedPriceLimit: gasSelector.latestBaseFeeGwei + gasSelector.perGasTipLimitFloor,
showPriceLimitWarning: gasSelector.showPriceLimitWarning,
showTipLimitWarning: gasSelector.showTipLimitWarning,
onConfirm: function(){
stack.next();
}
})
return
}
}
stack.next()
}
}
}
}
}
/*##^##
Designer {
D{i:0;autoSize:true;height:480;width:640}
}
##^##*/