status-desktop/ui/app/AppLayouts/Wallet/popups/AddAccountWithSeedModal.qml

163 lines
5.2 KiB
QML

import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQuick.Dialogs 1.3
import utils 1.0
import StatusQ.Core 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Controls 0.1
import shared.popups 1.0
import shared.controls 1.0
import "../stores"
// TODO: replace with StatusModal
ModalPopup {
id: popup
height: 615
property int marginBetweenInputs: 38
property string passwordValidationError: ""
property string seedValidationError: ""
property string accountNameValidationError: ""
property bool loading: false
signal afterAddAccount()
function reset() {
passwordInput.text = ""
accountNameInput.text = ""
seedPhraseTextArea.textArea.text = ""
}
function validate() {
if (passwordInput.text === "") {
//% "You need to enter a password"
passwordValidationError = qsTrId("you-need-to-enter-a-password")
} else if (passwordInput.text.length < 6) {
//% "Password needs to be 6 characters or more"
passwordValidationError = qsTrId("password-needs-to-be-6-characters-or-more")
} else {
passwordValidationError = ""
}
if (accountNameInput.text === "") {
//% "You need to enter an account name"
accountNameValidationError = qsTrId("you-need-to-enter-an-account-name")
} else {
accountNameValidationError = ""
}
if (seedPhraseTextArea.textArea.text === "") {
//% "You need to enter a seed phrase"
seedValidationError = qsTrId("you-need-to-enter-a-seed-phrase")
} else if (!Utils.isMnemonic(seedPhraseTextArea.textArea.text)) {
//% "Enter a valid mnemonic"
seedValidationError = qsTrId("enter-a-valid-mnemonic")
} else {
seedValidationError = ""
}
return passwordValidationError === "" && seedValidationError === "" && accountNameValidationError === ""
}
onOpened: {
seedPhraseTextArea.textArea.text = "";
passwordInput.text = "";
accountNameInput.text = "";
passwordValidationError = "";
seedValidationError = "";
accountNameValidationError = "";
accountColorInput.selectedColor = Theme.palette.accountColors[Math.floor(Math.random() * Theme.palette.accountColors.length)]
passwordInput.forceActiveFocus(Qt.MouseFocusReason)
}
//% "Add account with a seed phrase"
title: qsTrId("add-seed-account")
Input {
id: passwordInput
//% "Enter your password…"
placeholderText: qsTrId("enter-your-password…")
//% "Password"
label: qsTrId("password")
textField.echoMode: TextInput.Password
validationError: popup.passwordValidationError
}
SeedPhraseTextArea {
id: seedPhraseTextArea
anchors.top: passwordInput.bottom
anchors.topMargin: marginBetweenInputs
width: parent.width
}
Input {
id: accountNameInput
anchors.top: seedPhraseTextArea.bottom
anchors.topMargin: marginBetweenInputs
//% "Enter an account name..."
placeholderText: qsTrId("enter-an-account-name...")
//% "Account name"
label: qsTrId("account-name")
validationError: popup.accountNameValidationError
}
StatusWalletColorSelect {
id: accountColorInput
anchors.top: accountNameInput.bottom
anchors.topMargin: marginBetweenInputs
anchors.left: parent.left
anchors.right: parent.right
model: Theme.palette.accountColors
}
footer: StatusButton {
anchors.top: parent.top
anchors.right: parent.right
text: loading ?
//% "Loading..."
qsTrId("loading") :
//% "Add account"
qsTrId("add-account")
enabled: !loading && passwordInput.text !== "" && accountNameInput.text !== "" && seedPhraseTextArea.correctWordCount
MessageDialog {
id: accountError
title: "Adding the account failed"
icon: StandardIcon.Critical
standardButtons: StandardButton.Ok
}
onClicked : {
// TODO the loading doesn't work because the function freezes the view. Might need to use threads
loading = true
if (!validate() || !seedPhraseTextArea.validateSeed()) {
errorSound.play()
return loading = false
}
const result = RootStore.addAccountsFromSeed(seedPhraseTextArea.textArea.text, passwordInput.text, accountNameInput.text, accountColorInput.selectedColor)
loading = false
if (result) {
let resultJson = JSON.parse(result);
errorSound.play();
if (Utils.isInvalidPasswordMessage(resultJson.error)) {
//% "Wrong password"
popup.passwordValidationError = qsTrId("wrong-password")
} else {
accountError.text = resultJson.error
accountError.open()
}
return
}
popup.afterAddAccount()
popup.reset()
popup.close();
}
}
}