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

159 lines
5.1 KiB
QML
Raw Normal View History

2020-06-17 19:18:31 +00:00
import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQuick.Dialogs 1.3
import utils 1.0
import "../../../../shared"
import "../../../../shared/controls"
import "../../../../shared/popups"
import "../../../../shared/status"
import "../stores"
// TODO: replace with StatusModal
ModalPopup {
id: popup
height: 615
property int marginBetweenInputs: 38
2020-06-22 17:57:06 +00:00
property string passwordValidationError: ""
property string seedValidationError: ""
property string accountNameValidationError: ""
property bool loading: false
signal afterAddAccount()
2020-06-22 17:57:06 +00:00
function reset() {
passwordInput.text = ""
accountNameInput.text = ""
seedPhraseTextArea.textArea.text = ""
}
2020-06-22 17:57:06 +00:00
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) {
2021-02-18 16:36:05 +00:00
//% "Password needs to be 6 characters or more"
passwordValidationError = qsTrId("password-needs-to-be-6-characters-or-more")
2020-06-22 17:57:06 +00:00
} else {
passwordValidationError = ""
}
if (accountNameInput.text === "") {
//% "You need to enter an account name"
accountNameValidationError = qsTrId("you-need-to-enter-an-account-name")
2020-06-22 17:57:06 +00:00
} 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")
2020-06-22 17:57:06 +00:00
} else {
seedValidationError = ""
}
return passwordValidationError === "" && seedValidationError === "" && accountNameValidationError === ""
}
onOpened: {
seedPhraseTextArea.textArea.text = "";
passwordInput.text = "";
accountNameInput.text = "";
passwordValidationError = "";
seedValidationError = "";
accountNameValidationError = "";
accountColorInput.selectedColor = Style.current.accountColors[Math.floor(Math.random() * Style.current.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
2020-06-22 17:57:06 +00:00
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")
2020-06-22 17:57:06 +00:00
validationError: popup.accountNameValidationError
}
StatusWalletColorSelect {
id: accountColorInput
anchors.top: accountNameInput.bottom
anchors.topMargin: marginBetweenInputs
anchors.left: parent.left
anchors.right: parent.right
}
footer: StatusButton {
anchors.top: parent.top
anchors.right: parent.right
text: loading ?
//% "Loading..."
qsTrId("loading") :
2021-02-18 16:36:05 +00:00
//% "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
fix: prevent crash on generate account wrong password Fixes #2448. Currently, if a wrong password is entered when generating a wallet account, the app will crash due to attempting to decode a `GeneratedAccount ` from an rpc response containing only an error. With this PR, we are detecting if an error is returned in the response, and if so, raising a StatusGoException. This exception is caught in the call chain, and translated in to a `StatusGoError` which is serialised and sent to the QML view, where it is parsed and displayed as an invalid password error in the input box. refactor: remove string return values as error messages in wallet model In the wallet model, we were passing back empty strings for no error, or an error as a string. This is not only confusing, but does not benefit from leaning on the compiler and strong types. One has to read the entire code to understand if a string result is returned when there is no error instead of implicitly being able to understand there is no return type. To alleviate this, account creation fundtions that do not need to return a value have been changed to a void return type, and raise `StatusGoException` if there is an error encountered. This can be caught in the call chain and used as necessary (ie to pass to QML). refactor: move invalid password string detection to Utils Currently, we are reading returned view model values and checking to see if they include a known string from Status Go that means there was an invalid password used. This string was placed in the codebased in mulitple locations. This PR moves the string check to a Utils function and updates all the references to use the function in Utils.
2021-05-13 04:41:48 +00:00
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
2020-06-22 17:57:06 +00:00
}
popup.afterAddAccount()
popup.reset()
popup.close();
}
}
}