mirror of
https://github.com/status-im/status-desktop.git
synced 2025-02-10 13:46:35 +00:00
f0b39ce4f6
The openPopup function was declared in AppMain and used via dynamic scoping in many places in the application. Moved function to Global component and updated all places to call it via Global instead. Closes #4267
248 lines
9.2 KiB
QML
248 lines
9.2 KiB
QML
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.controls 1.0
|
|
|
|
// TODO: replace with StatusModal
|
|
ModalPopup {
|
|
id: root
|
|
readonly property var asset: {"name": "Ethereum", "symbol": "ETH"}
|
|
|
|
title: qsTr("Contract interaction")
|
|
|
|
property var estimateGasFunction: (function(userAddress) { return 0; })
|
|
property var onSendTransaction: (function(userAddress, gasLimit, gasPrice, password){ return ""; })
|
|
property var onSuccess: (function(){})
|
|
|
|
Component.onCompleted: {
|
|
walletModel.gasView.getGasPricePredictions()
|
|
}
|
|
|
|
height: 540
|
|
|
|
function sendTransaction() {
|
|
try {
|
|
let responseStr = profileModel.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()
|
|
}
|
|
}
|
|
|
|
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
|
|
headerText: root.title
|
|
//% "Continue"
|
|
footerText: qsTrId("continue")
|
|
|
|
StatusAccountSelector {
|
|
id: selectFromAccount
|
|
accounts: walletSectionAccounts.model
|
|
selectedAccount: {
|
|
const currAcc = walletSectionCurrent
|
|
if (currAcc.walletType !== Constants.watchWalletType) {
|
|
return currAcc
|
|
}
|
|
return null
|
|
}
|
|
currency: walletModel.balanceView.defaultCurrency
|
|
width: stack.width
|
|
//% "Choose account"
|
|
label: qsTrId("choose-account")
|
|
showBalanceForAssetSymbol: "ETH"
|
|
minRequiredAssetBalance: 0
|
|
onSelectedAccountChanged: if (isValid) { gasSelector.estimateGas() }
|
|
}
|
|
RecipientSelector {
|
|
id: selectRecipient
|
|
visible: false
|
|
accounts: walletModel.accountsView.accounts
|
|
contacts: contactsModule.model.addedContacts
|
|
selectedRecipient: { "address": utilsModel.ensRegisterAddress, "type": RecipientSelector.Type.Address }
|
|
readOnly: true
|
|
onSelectedRecipientChanged: if (isValid) { gasSelector.estimateGas() }
|
|
}
|
|
GasSelector {
|
|
id: gasSelector
|
|
visible: true
|
|
anchors.top: selectFromAccount.bottom
|
|
anchors.topMargin: Style.current.padding
|
|
gasPrice: parseFloat(walletModel.gasView.gasPrice)
|
|
getGasEthValue: walletModel.gasView.getGasEthValue
|
|
getFiatValue: walletModel.balanceView.getFiatValue
|
|
defaultCurrency: walletModel.balanceView.defaultCurrency
|
|
|
|
property var estimateGas: Backpressure.debounce(gasSelector, 600, function() {
|
|
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
|
|
headerText: root.title
|
|
//% "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
|
|
currency: walletModel.balanceView.defaultCurrency
|
|
amount: {
|
|
const fiatValue = walletModel.balanceView.getFiatValue(0, root.asset.symbol, currency)
|
|
return { "value": 0, "fiatValue": fiatValue }
|
|
}
|
|
}
|
|
}
|
|
TransactionFormGroup {
|
|
id: group4
|
|
headerText: root.title
|
|
//% "Sign with password"
|
|
footerText: qsTrId("sign-with-password")
|
|
|
|
TransactionSigner {
|
|
id: transactionSigner
|
|
width: stack.width
|
|
signingPhrase: walletModel.utilsView.signingPhrase
|
|
}
|
|
}
|
|
}
|
|
|
|
footer: Item {
|
|
width: parent.width
|
|
height: btnNext.height
|
|
|
|
StatusRoundButton {
|
|
id: btnBack
|
|
anchors.left: parent.left
|
|
icon.name: "arrow-right"
|
|
icon.width: 20
|
|
icon.height: 16
|
|
icon.rotation: 180
|
|
visible: stack.currentGroup.showBackBtn
|
|
enabled: stack.currentGroup.isValid || stack.isLastGroup
|
|
onClicked: {
|
|
if (typeof stack.currentGroup.onBackClicked === "function") {
|
|
return stack.currentGroup.onBackClicked()
|
|
}
|
|
stack.back()
|
|
}
|
|
}
|
|
|
|
Component {
|
|
id: transactionSettingsConfirmationPopupComponent
|
|
TransactionSettingsConfirmationPopup {
|
|
|
|
}
|
|
}
|
|
|
|
StatusButton {
|
|
id: btnNext
|
|
anchors.right: parent.right
|
|
//% "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()
|
|
}
|
|
|
|
if(gasSelector.eip1599Enabled && stack.currentGroup === group2 && gasSelector.advancedMode){
|
|
if(gasSelector.showPriceLimitWarning || gasSelector.showTipLimitWarning){
|
|
Global.openPopup(transactionSettingsConfirmationPopupComponent, {
|
|
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}
|
|
}
|
|
##^##*/
|