From 5a8966f55063d8916ec976b5f481f1c1386ec259 Mon Sep 17 00:00:00 2001
From: Anthony Laibe <491074+alaibe@users.noreply.github.com>
Date: Mon, 11 Dec 2023 13:58:15 +0100
Subject: [PATCH] feat(@wallet): delete account new design
fixes #12538
---
.../Profile/views/wallet/AccountView.qml | 32 ++++--
.../AppLayouts/Wallet/views/LeftTabView.qml | 15 ++-
.../popups/RemoveAccountConfirmationPopup.qml | 101 +++++++++++-------
3 files changed, 97 insertions(+), 51 deletions(-)
diff --git a/ui/app/AppLayouts/Profile/views/wallet/AccountView.qml b/ui/app/AppLayouts/Profile/views/wallet/AccountView.qml
index e803825b6d..d6d92bffce 100644
--- a/ui/app/AppLayouts/Profile/views/wallet/AccountView.qml
+++ b/ui/app/AppLayouts/Profile/views/wallet/AccountView.qml
@@ -41,6 +41,7 @@ ColumnLayout {
id: d
readonly property bool watchOnlyAccount: !!root.keyPair? root.keyPair.pairType === Constants.keypair.type.watchOnly: false
readonly property bool privateKeyAccount: !!root.keyPair? root.keyPair.pairType === Constants.keypair.type.privateKeyImport: false
+ readonly property bool seedImport: !!root.keyPair? root.keyPair.pairType === Constants.keypair.type.seedImport: false
readonly property string preferredSharingNetworks: !!root.account? root.account.preferredSharingChainIds: ""
property var preferredSharingNetworksArray: preferredSharingNetworks.split(":").filter(Boolean)
property string preferredSharingNetworkShortNames: walletStore.getNetworkShortNames(preferredSharingNetworks)
@@ -300,18 +301,29 @@ ColumnLayout {
type: StatusBaseButton.Type.Danger
onClicked: confirmationPopup.open()
- ConfirmationDialog {
+ RemoveAccountConfirmationPopup {
id: confirmationPopup
- objectName: "deleteAccountConfirmationPopup"
- confirmButtonObjectName: "confirmDeleteAccountButton"
- headerSettings.title: qsTr("Confirm %1 Removal").arg(!!root.account? root.account.name : "")
- confirmationText: qsTr("You will not be able to restore viewing access to this account in the future unless you enter this account’s address again.")
- confirmButtonLabel: qsTr("Remove Account")
- onConfirmButtonClicked: {
- if (!!root.account) {
- root.walletStore.deleteAccount(root.account.address)
+ accountType: {
+ if (d.watchOnlyAccount) {
+ return Constants.watchWalletType
+ } else if (d.privateKeyAccount) {
+ return Constants.keyWalletType
+ } else if (d.seedImport){
+ return Constants.seedWalletType
+ } else {
+ return Constants.generatedWalletType
}
- confirmationPopup.close()
+ }
+ accountName: !!root.account ? root.account.name : ""
+ accountAddress: !!root.account ? root.account.address : ""
+ accountDerivationPath: !!root.account ? root.account.path : ""
+ preferredSharingNetworkShortNames: d.preferredSharingNetworkShortNames
+ emoji: !!root.account ? root.account.emoji : ""
+ color: !!root.account ? Utils.getColorForId(root.account.colorId) : ""
+
+ onRemoveAccount: {
+ root.walletStore.deleteAccount(root.account.address)
+ close()
root.goBack()
}
}
diff --git a/ui/app/AppLayouts/Wallet/views/LeftTabView.qml b/ui/app/AppLayouts/Wallet/views/LeftTabView.qml
index c4dde070f8..d0abc206f2 100644
--- a/ui/app/AppLayouts/Wallet/views/LeftTabView.qml
+++ b/ui/app/AppLayouts/Wallet/views/LeftTabView.qml
@@ -109,10 +109,13 @@ Rectangle {
onDeleteAccountClicked: {
if (!account)
return
- removeAccountConfirmation.simple = account.walletType === Constants.watchWalletType || account.walletType === Constants.keyWalletType
+ removeAccountConfirmation.accountType = account.walletType
removeAccountConfirmation.accountName = account.name
removeAccountConfirmation.accountAddress = account.address
removeAccountConfirmation.accountDerivationPath = account.path
+ removeAccountConfirmation.preferredSharingChainIds = account.preferredSharingChainIds
+ removeAccountConfirmation.emoji = account.emoji
+ removeAccountConfirmation.colorId = account.colorId
removeAccountConfirmation.active = true
}
@@ -124,17 +127,23 @@ Rectangle {
id: removeAccountConfirmation
active: false
- property bool simple
+ property string accountType
property string accountKeyUid
property string accountName
property string accountAddress
property string accountDerivationPath
+ property string preferredSharingChainIds
+ property string emoji
+ property string colorId
sourceComponent: RemoveAccountConfirmationPopup {
- simple: removeAccountConfirmation.simple
+ accountType: removeAccountConfirmation.accountType
accountName: removeAccountConfirmation.accountName
accountAddress: removeAccountConfirmation.accountAddress
accountDerivationPath: removeAccountConfirmation.accountDerivationPath
+ preferredSharingNetworkShortNames: RootStore.getNetworkShortNames(removeAccountConfirmation.preferredSharingChainIds)
+ emoji: removeAccountConfirmation.emoji
+ color: Utils.getColorForId(removeAccountConfirmation.colorId)
onClosed: {
removeAccountConfirmation.active = false
diff --git a/ui/imports/shared/popups/RemoveAccountConfirmationPopup.qml b/ui/imports/shared/popups/RemoveAccountConfirmationPopup.qml
index a5efb160fd..d3f1760380 100644
--- a/ui/imports/shared/popups/RemoveAccountConfirmationPopup.qml
+++ b/ui/imports/shared/popups/RemoveAccountConfirmationPopup.qml
@@ -1,26 +1,34 @@
import QtQuick 2.15
import QtQuick.Controls 2.15
+import QtQml.Models 2.15
import QtQuick.Layouts 1.15
import StatusQ.Core 0.1
+import StatusQ.Components 0.1
import StatusQ.Core.Theme 0.1
+import StatusQ.Core.Utils 0.1 as StatusQUtils
import StatusQ.Controls 0.1
-import StatusQ.Popups 0.1
+import StatusQ.Popups.Dialog 0.1
+
+import AppLayouts.Wallet 1.0
import utils 1.0
import shared.controls 1.0
-StatusModal {
+StatusDialog {
id: root
- required property bool simple
+ required property string accountType
required property string accountName
required property string accountAddress
required property string accountDerivationPath
+ required property string preferredSharingNetworkShortNames
+ required property string emoji
+ required property string color
signal removeAccount(string address)
- headerSettings.title: qsTr("Remove %1").arg(root.accountName)
+ width: 521
focus: visible
padding: Style.current.padding
@@ -30,13 +38,23 @@ StatusModal {
readonly property real lineHeight: 1.2
function confirm() {
- if (!root.simple && !derivationPathWritten.checked) {
+ if (root.accountType !== Constants.watchWalletType && !derivationPathWritten.checked) {
return
}
root.removeAccount(root.accountAddress)
}
}
+ header: StatusDialogHeader {
+ headline.title: qsTr("Remove %1").arg(root.accountName)
+ headline.subtitle: WalletUtils.colorizedChainPrefix(root.preferredSharingNetworkShortNames) + StatusQUtils.Utils.elideText(root.accountAddress, 6, 4)
+ actions.closeButton.onClicked: root.close()
+ leftComponent: StatusSmartIdenticon {
+ asset.emoji: root.emoji
+ asset.color: root.color
+ }
+ }
+
contentItem: ColumnLayout {
spacing: Style.current.halfPadding
@@ -47,21 +65,20 @@ StatusModal {
textFormat: Text.RichText
font.pixelSize: Style.current.primaryTextFontSize
lineHeight: d.lineHeight
- text: root.simple?
- qsTr("Are you sure you want to remove %1?
-The account will be removed from all of your synced devices.").arg("%1".arg(root.accountName))
- : qsTr("Are you sure you want to remove %1?
-The account will be removed from all of your synced devices.
-Make sure you have a backup of your keys or recovery phrase before proceeding.
-%2
-Copying the derivation path to this account now will enable you to import it again
-at a later date should you wish to do so:").arg("%1".arg(root.accountName)).arg("
")
+ text: {
+ switch(root.accountType) {
+ case Constants.generatedWalletType: return qsTr("Are you sure you want to remove %1? The account will be removed from all of your synced devices. Make sure you have a backup of your keys or recovery phrase before proceeding. %2 Copying the derivation path to this account now will enable you to import it again at a later date should you wish to do so:").arg("%1".arg(root.accountName)).arg("
")
+ case Constants.watchWalletType: return qsTr("Are you sure you want to remove %1? The address will be removed from all of your synced devices.").arg("%1".arg(root.accountName))
+ case Constants.keyWalletType: return qsTr("Are you sure you want to remove %1 and it's associated private key? The account and private key will be removed from all of your synced devices.").arg("%1".arg(root.accountName))
+ case Constants.seedWalletType: return qsTr("Are you sure you want to remove %1? The account will be removed from all of your synced devices. Copying the derivation path to this account now will enable you to import it again at a later date should you with to do so:").arg("%1".arg(root.accountName))
+ }
+ }
}
StatusBaseText {
Layout.preferredWidth: parent.width
Layout.topMargin: Style.current.padding
- visible: !root.simple
+ visible: root.accountType === Constants.generatedWalletType || root.accountType === Constants.seedWalletType
text: qsTr("Derivation path for %1").arg(root.accountName)
font.pixelSize: Style.current.primaryTextFontSize
lineHeight: d.lineHeight
@@ -70,7 +87,7 @@ at a later date should you wish to do so:").arg("%1".arg(root.accountName
StatusInput {
objectName: "RemoveAccountPopup-DerivationPath"
Layout.preferredWidth: parent.width
- visible: !root.simple
+ visible: root.accountType === Constants.generatedWalletType || root.accountType === Constants.seedWalletType
input.edit.enabled: false
text: root.accountDerivationPath
input.background.color: "transparent"
@@ -86,34 +103,42 @@ at a later date should you wish to do so:").arg("%1".arg(root.accountName
Layout.preferredWidth: parent.width
Layout.preferredHeight: d.checkboxHeight
Layout.topMargin: Style.current.padding
- visible: !root.simple
+ visible: root.accountType !== Constants.watchWalletType
spacing: Style.current.padding
font.pixelSize: Style.current.primaryTextFontSize
- text: qsTr("I have a pen and paper")
+ text: {
+ if (root.accountType === Constants.keyWalletType) {
+ return qsTr("I have a copy of the private key")
+ }
+ return qsTr("I have taken note of the derivation path")
+ }
}
}
- rightButtons: [
- StatusFlatButton {
- objectName: "RemoveAccountPopup-CancelButton"
- text: qsTr("Cancel")
- type: StatusBaseButton.Type.Normal
- onClicked: {
- root.close()
+ footer: StatusDialogFooter {
+ spacing: Style.current.padding
+ rightButtons: ObjectModel {
+ StatusFlatButton {
+ objectName: "RemoveAccountPopup-CancelButton"
+ text: qsTr("Cancel")
+ type: StatusBaseButton.Type.Normal
+ onClicked: {
+ root.close()
+ }
}
- },
- StatusButton {
- objectName: "RemoveAccountPopup-ConfirmButton"
- text: qsTr("Remove")
- type: StatusBaseButton.Type.Danger
- enabled: root.simple || derivationPathWritten.checked
- focus: true
- Keys.onReturnPressed: function(event) {
- d.confirm()
- }
- onClicked: {
- d.confirm()
+ StatusButton {
+ objectName: "RemoveAccountPopup-ConfirmButton"
+ text: qsTr("Remove %1").arg(root.accountName)
+ type: StatusBaseButton.Type.Danger
+ enabled: root.accountType === Constants.watchWalletType || derivationPathWritten.checked
+ focus: true
+ Keys.onReturnPressed: function(event) {
+ d.confirm()
+ }
+ onClicked: {
+ d.confirm()
+ }
}
}
- ]
+ }
}