import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 import StatusQ.Core 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*Style.current.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 %1 is already saved under the name %2.

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) } } ] }