status-desktop/ui/app/AppLayouts/Communities/popups/RemotelyDestructPopup.qml
Alex Jbanca 8b4cbc59a8 refactor: Refactoring of AccountSelector dropdown
The new account selector expects a generic account model. It will display all the account data if provided, including preferred chains, balance or asset balance. Otherwise it will display only the available data.
The account selector can receive an initial selection based on account address and will provide the current selected address and the current selected model item.

- Unify the account selector between communities and wallet
- Update the account selector to work with addresses instead of model indexes
- Adapt all components using the account selector or the account selection
- Move/reuse qml components involved in the account selector UI
- Remove nim logic used to handle index based account selection.
- Adding storybook page
2024-06-20 11:24:35 +03:00

159 lines
5.0 KiB
QML

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtQml.Models 2.15
import StatusQ.Core 0.1
import StatusQ.Controls 0.1
import StatusQ.Popups.Dialog 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Core.Utils 0.1
import AppLayouts.Communities.panels 1.0
import utils 1.0
StatusDialog {
id: root
property alias model: tokenHoldersPanel.model
property string collectibleName
property string chainName
// Fees related properties:
property bool isFeeLoading
property string feeText: ""
property string feeErrorText: ""
property string feeLabel: qsTr("Remotely destruct %1 token on %2").arg(root.collectibleName).arg(root.chainName)
readonly property alias tokenCount: d.tokenCount
readonly property string selectedAccount: d.accountAddress
readonly property var selectedWalletsAndAmounts: {
//depedency
d.tokenCount
return ModelUtils.modelToArray(d.walletsAndAmountsList)
}
// Account expected roles: address, name, color, emoji, walletType
property var accounts
signal remotelyDestructClicked(var walletsAndAmounts, string accountAddress)
QtObject {
id: d
property string accountAddress
readonly property int maxHeight: 560 // by design
property int tokenCount: 0
readonly property ListModel walletsAndAmountsList: ListModel {}
readonly property bool isFeeError: root.feeErrorText !== ""
function getVerticalPadding() {
return root.topPadding + root.bottomPadding
}
function getHorizontalPadding() {
return root.leftPadding + root.rightPadding
}
function updateTokensToDestruct(walletAddress, amount) {
const index = ModelUtils.indexOf(d.walletsAndAmountsList,
"walletAddress", walletAddress)
if (index !== -1)
d.walletsAndAmountsList.setProperty(index, "amount", amount)
else
d.walletsAndAmountsList.append({ walletAddress, amount })
updateTokensCount()
}
function clearTokensToDestruct(walletAddress) {
const index = ModelUtils.indexOf(d.walletsAndAmountsList,
"walletAddress", walletAddress)
d.walletsAndAmountsList.remove(index)
updateTokensCount()
}
function updateTokensCount() {
const amounts = ModelUtils.modelToFlatArray(
d.walletsAndAmountsList, "amount")
const sum = amounts.reduce((a, b) => a + b, 0)
d.tokenCount = sum
}
}
title: qsTr("Remotely destruct %1 token").arg(root.collectibleName)
implicitWidth: 600 // by design
padding: 0
contentItem: ColumnLayout {
spacing: Style.current.padding
TokenHoldersPanel {
id: tokenHoldersPanel
tokenName: root.collectibleName
Layout.fillWidth: true
Layout.fillHeight: true
isSelectorMode: true
onSelfDestructAmountChanged: d.updateTokensToDestruct(walletAddress, amount)
onSelfDestructRemoved: d.clearTokensToDestruct(walletAddress)
}
FeesBox {
id: feesBox
Layout.fillWidth: true
Layout.bottomMargin: 16
Layout.leftMargin: 16
Layout.rightMargin: 16
implicitWidth: 0
accountErrorText: root.feeErrorText
placeholderText: qsTr("Select a hodler to see remote destruction gas fees")
showAccountsSelector: true
model: d.tokenCount > 0 ? singleFeeModel : undefined
accountsSelector.model: root.accounts
Binding {
target: d
property: "accountAddress"
value: feesBox.accountsSelector.currentAccountAddress
}
QtObject {
id: singleFeeModel
readonly property string title: root.feeLabel
readonly property string feeText: root.isFeeLoading ?
"" : root.feeText
readonly property bool error: d.isFeeError
}
}
}
footer: StatusDialogFooter {
spacing: Style.current.padding
rightButtons: ObjectModel {
StatusFlatButton {
text: qsTr("Cancel")
onClicked: {
root.close()
}
}
StatusButton {
enabled: d.tokenCount > 0
text: qsTr("Remotely destruct %n token(s)", "", d.tokenCount)
type: StatusBaseButton.Type.Danger
onClicked: {
const walletsAndAmounts = ModelUtils.modelToArray(
d.walletsAndAmountsList)
root.remotelyDestructClicked(walletsAndAmounts,
d.accountAddress)
}
}
}
}
}