status-desktop/ui/imports/shared/popups/addaccount/AddAccountPopup.qml

375 lines
14 KiB
QML

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Popups 0.1
import StatusQ.Controls 0.1
import StatusQ.Popups.Dialog 0.1
import utils 1.0
import shared.popups 1.0
import "./stores"
import "./states"
import "../common"
StatusModal {
id: root
property AddAccountStore store: AddAccountStore { }
enum LimitWarning {
Accounts,
Keypairs,
WatchOnlyAccounts
}
width: Constants.addAccountPopup.popupWidth
closePolicy: root.store.disablePopup? Popup.NoAutoClose : Popup.CloseOnEscape | Popup.CloseOnPressOutside
hasCloseButton: !root.store.disablePopup
headerSettings.title: root.store.editMode? qsTr("Edit account") : qsTr("Add a new account")
onOpened: {
root.store.resetStoreValues()
root.store.showLimitPopup.connect(limitPopup.showPopup)
}
onClosed: {
root.store.currentState.doCancelAction()
}
Connections {
target: root.store.addAccountModule
function onConfirmSavedAddressRemoval(name, address) {
Global.openPopup(confirmSavedAddressRemoval, {address: address, name: name})
}
}
StatusScrollView {
id: scrollView
anchors.fill: parent
padding: 0
contentWidth: availableWidth
Item {
id: content
objectName: "AddAccountPopup-Content"
implicitWidth: loader.implicitWidth
implicitHeight: loader.implicitHeight
width: scrollView.availableWidth
Loader {
id: limitPopup
active: false
asynchronous: true
property string title
property string content
function showPopup(warningType) {
if (warningType === AddAccountPopup.LimitWarning.Accounts) {
limitPopup.title = Constants.walletConstants.maxNumberOfAccountsTitle
limitPopup.content = Constants.walletConstants.maxNumberOfAccountsContent
} else if (warningType === AddAccountPopup.LimitWarning.Keypairs) {
limitPopup.title = Constants.walletConstants.maxNumberOfKeypairsTitle
limitPopup.content = Constants.walletConstants.maxNumberOfKeypairsContent
} else if (warningType === AddAccountPopup.LimitWarning.WatchOnlyAccounts) {
limitPopup.title = Constants.walletConstants.maxNumberOfWatchOnlyAccountsTitle
limitPopup.content = Constants.walletConstants.maxNumberOfSavedAddressesContent
} else {
console.error("unsupported warning type")
return
}
limitPopup.active = true
}
sourceComponent: StatusDialog {
width: root.width - 2*Theme.padding
property string contentText
title: Constants.walletConstants.maxNumberOfAccountsTitle
StatusBaseText {
anchors.fill: parent
text: contentText
wrapMode: Text.WordWrap
}
standardButtons: Dialog.Ok
onClosed: {
limitPopup.active = false
}
}
onLoaded: {
limitPopup.item.title = limitPopup.title
limitPopup.item.contentText = limitPopup.content
limitPopup.item.open()
}
}
Loader {
id: loader
width: parent.width
sourceComponent: {
switch (root.store.currentState.stateType) {
case Constants.addAccountPopup.state.main:
return mainComponent
case Constants.addAccountPopup.state.confirmAddingNewMasterKey:
return confirmAddingNewMasterKeyComponent
case Constants.addAccountPopup.state.confirmSeedPhraseBackup:
return confirmSeedPhraseBackupComponent
case Constants.addAccountPopup.state.displaySeedPhrase:
return displaySeedPhraseComponent
case Constants.addAccountPopup.state.enterKeypairName:
return enterKeypairNameComponent
case Constants.addAccountPopup.state.enterPrivateKey:
return enterPrivateKeyComponent
case Constants.addAccountPopup.state.enterSeedPhraseWord1:
case Constants.addAccountPopup.state.enterSeedPhraseWord2:
return enterSeedPhraseWordComponent
case Constants.addAccountPopup.state.enterSeedPhrase:
return enterSeedPhraseComponent
case Constants.addAccountPopup.state.selectMasterKey:
return selectMasterKeyComponent
}
return undefined
}
onLoaded: {
content.height = Qt.binding(function(){return item.height})
}
}
Component {
id: mainComponent
Main {
store: root.store
onWatchOnlyAccountsLimitReached: {
limitPopup.showPopup(AddAccountPopup.LimitWarning.WatchOnlyAccounts)
}
onKeypairLimitReached: {
limitPopup.showPopup(AddAccountPopup.LimitWarning.Keypairs)
}
}
}
Component {
id: confirmAddingNewMasterKeyComponent
ConfirmAddingNewMasterKey {
height: Constants.addAccountPopup.contentHeight1
store: root.store
}
}
Component {
id: confirmSeedPhraseBackupComponent
ConfirmSeedPhraseBackup {
height: Constants.addAccountPopup.contentHeight1
store: root.store
}
}
Component {
id: displaySeedPhraseComponent
DisplaySeedPhrase {
height: Constants.addAccountPopup.contentHeight1
store: root.store
}
}
Component {
id: enterKeypairNameComponent
EnterKeypairName {
height: Constants.addAccountPopup.contentHeight1
store: root.store
}
}
Component {
id: enterPrivateKeyComponent
EnterPrivateKey {
height: Constants.addAccountPopup.contentHeight1
store: root.store
}
}
Component {
id: enterSeedPhraseComponent
EnterSeedPhrase {
height: Constants.addAccountPopup.contentHeight2
store: root.store
}
}
Component {
id: enterSeedPhraseWordComponent
EnterSeedPhraseWord {
height: Constants.addAccountPopup.contentHeight1
store: root.store
}
}
Component {
id: selectMasterKeyComponent
SelectMasterKey {
height: Constants.addAccountPopup.contentHeight1
store: root.store
onContinueOnKeycard: {
root.close()
}
}
}
}
Component {
id: confirmSavedAddressRemoval
ConfirmationDialog {
property string name
property string address
closePolicy: Popup.NoAutoClose
hasCloseButton: false
headerSettings.title: qsTr("Removing saved address")
confirmationText: qsTr("The account you're trying to add <b>%1</b> is already saved under the name <b>%2</b>.<br/><br/>Do you want to remove it from saved addresses in favour of adding it to the Wallet?")
.arg(address)
.arg(name)
showCancelButton: true
cancelBtnType: ""
confirmButtonLabel: qsTr("Yes")
cancelButtonLabel: qsTr("No")
onConfirmButtonClicked: {
root.store.addAccountModule.removingSavedAddressConfirmed(address)
close()
}
onCancelButtonClicked: {
root.store.addAccountModule.removingSavedAddressRejected()
close()
}
}
}
}
leftButtons: [
StatusBackButton {
id: backButton
objectName: "AddAccountPopup-BackButton"
visible: root.store.currentState.displayBackButton
enabled: !root.store.disablePopup
Layout.minimumWidth: implicitWidth
onClicked: {
if (root.store.currentState.stateType === Constants.addAccountPopup.state.confirmAddingNewMasterKey) {
root.store.addingNewMasterKeyConfirmed = false
}
else if (root.store.currentState.stateType === Constants.addAccountPopup.state.displaySeedPhrase) {
root.store.seedPhraseRevealed = false
}
else if (root.store.currentState.stateType === Constants.addAccountPopup.state.enterSeedPhraseWord1) {
root.store.seedPhraseWord1Valid = false
root.store.seedPhraseWord1WordNumber = -1
root.store.seedPhraseWord2Valid = false
root.store.seedPhraseWord2WordNumber = -1
}
else if (root.store.currentState.stateType === Constants.addAccountPopup.state.confirmSeedPhraseBackup) {
root.store.seedPhraseBackupConfirmed = false
}
else if (root.store.currentState.stateType === Constants.addAccountPopup.state.enterKeypairName) {
root.store.addAccountModule.newKeyPairName = ""
}
root.store.currentState.doBackAction()
}
}
]
rightButtons: [
StatusButton {
id: primaryButton
objectName: "AddAccountPopup-PrimaryButton"
type: root.store.currentState.stateType === Constants.addAccountPopup.state.main?
StatusBaseButton.Type.Primary :
StatusBaseButton.Type.Normal
height: Constants.addAccountPopup.footerButtonsHeight
text: {
if (root.store.editMode) {
return qsTr("Save changes")
}
switch (root.store.currentState.stateType) {
case Constants.addAccountPopup.state.main:
return qsTr("Add account")
case Constants.addAccountPopup.state.enterPrivateKey:
case Constants.addAccountPopup.state.enterSeedPhrase:
case Constants.addAccountPopup.state.enterSeedPhraseWord1:
case Constants.addAccountPopup.state.enterSeedPhraseWord2:
case Constants.addAccountPopup.state.confirmSeedPhraseBackup:
case Constants.addAccountPopup.state.enterKeypairName:
return qsTr("Continue")
case Constants.addAccountPopup.state.confirmAddingNewMasterKey:
return qsTr("Reveal seed phrase")
case Constants.addAccountPopup.state.displaySeedPhrase:
return qsTr("Confirm seed phrase")
}
return ""
}
visible: text !== ""
enabled: root.store.primaryPopupButtonEnabled
icon.name: {
if (root.store.editMode) {
return ""
}
if (root.store.currentState.stateType === Constants.addAccountPopup.state.enterPrivateKey ||
root.store.currentState.stateType === Constants.addAccountPopup.state.enterSeedPhrase ||
root.store.currentState.stateType === Constants.addAccountPopup.state.confirmAddingNewMasterKey ||
root.store.currentState.stateType === Constants.addAccountPopup.state.displaySeedPhrase ||
root.store.currentState.stateType === Constants.addAccountPopup.state.enterSeedPhraseWord1 ||
root.store.currentState.stateType === Constants.addAccountPopup.state.enterSeedPhraseWord2 ||
root.store.currentState.stateType === Constants.addAccountPopup.state.confirmSeedPhraseBackup ||
root.store.currentState.stateType === Constants.addAccountPopup.state.enterKeypairName ||
root.store.addAccountModule.actionAuthenticated ||
root.store.selectedOrigin.pairType === Constants.addAccountPopup.keyPairType.unknown &&
root.store.selectedOrigin.keyUid === Constants.appTranslatableConstants.addAccountLabelOptionAddWatchOnlyAcc) {
return ""
}
if (root.store.selectedOrigin.keyUid === root.store.userProfileKeyUid &&
root.store.userProfileUsingBiometricLogin) {
return "touch-id"
}
if (root.store.selectedOrigin.migratedToKeycard || root.store.userProfileIsKeycardUser) {
return "keycard"
}
return "password"
}
onClicked: {
root.store.submitPopup(null)
}
}
]
}