status-desktop/ui/app/AppLayouts/Onboarding/shared/CreatePasswordModal.qml

208 lines
7.3 KiB
QML
Raw Normal View History

2020-06-17 19:18:31 +00:00
import QtQuick 2.13
import QtQuick.Controls 2.13
2020-06-12 20:47:44 +00:00
import QtQuick.Dialogs 1.3
import StatusQ.Controls 0.1
import StatusQ.Controls.Validators 0.1
import utils 1.0
import shared 1.0
import shared.panels 1.0
import shared.popups 1.0
import shared.controls 1.0
2020-06-12 20:47:44 +00:00
import "../stores"
// TODO: replace with StatusModal
2020-06-12 20:47:44 +00:00
ModalPopup {
property var privacyStore
2020-06-12 20:47:44 +00:00
property bool loading: false
property bool firstPasswordFieldValid: false
property bool repeatPasswordFieldValid: false
property string passwordValidationError: ""
property string repeatPasswordValidationError: ""
signal offerToStorePassword(string password, bool runStoreToKeychainPopup)
2020-06-12 20:47:44 +00:00
id: popup
title: qsTr("Store password")
2020-06-12 20:47:44 +00:00
height: 500
onOpened: {
if (userProfile.isKeycardUser) {
firstPinInputField.statesInitialization()
firstPinInputField.forceFocus()
}
else {
firstPasswordField.text = "";
firstPasswordField.forceActiveFocus(Qt.MouseFocusReason)
}
2020-06-12 20:47:44 +00:00
}
Column {
anchors.fill: parent
leftPadding: d.padding
rightPadding: d.padding
topPadding: Style.current.xlPadding
bottomPadding: Style.current.xlPadding
spacing: Style.current.xlPadding
QtObject {
id: d
readonly property int padding: 56
readonly property int fontSize: 15
}
2020-06-12 20:47:44 +00:00
Input {
id: firstPasswordField
width: parent.width - 2 * d.padding
visible: !userProfile.isKeycardUser
placeholderText: qsTr("Current password...")
textField.echoMode: TextInput.Password
onTextChanged: {
[firstPasswordFieldValid, passwordValidationError] =
Utils.validatePasswords("first", firstPasswordField, repeatPasswordField);
[repeatPasswordFieldValid, repeatPasswordValidationError] =
Utils.validatePasswords("repeat", firstPasswordField, repeatPasswordField);
}
2020-06-12 20:47:44 +00:00
}
Input {
id: repeatPasswordField
visible: !userProfile.isKeycardUser
width: parent.width - 2 * d.padding
enabled: firstPasswordFieldValid
placeholderText: qsTr("Confirm password…")
textField.echoMode: TextInput.Password
Keys.onReturnPressed: function(event) {
if (submitBtn.enabled) {
submitBtn.clicked(event)
}
}
onTextChanged: {
[repeatPasswordFieldValid, repeatPasswordValidationError] =
Utils.validatePasswords("repeat", firstPasswordField, repeatPasswordField);
}
}
2020-06-12 20:47:44 +00:00
StyledText {
anchors.horizontalCenter: parent.horizontalCenter
visible: userProfile.isKeycardUser
text: qsTr("Enter new PIN")
font.pixelSize: d.fontSize
}
StatusPinInput {
id: firstPinInputField
anchors.horizontalCenter: parent.horizontalCenter
visible: userProfile.isKeycardUser
validator: StatusIntValidator{bottom: 0; top: 999999;}
pinLen: Constants.keycard.general.keycardPinLength
onPinInputChanged: {
if (pinInput.length == Constants.keycard.general.keycardPinLength) {
repeatPinInputField.statesInitialization()
repeatPinInputField.forceFocus()
}
[firstPasswordFieldValid, passwordValidationError] =
Utils.validatePINs("first", firstPinInputField, repeatPinInputField);
[repeatPasswordFieldValid, repeatPasswordValidationError] =
Utils.validatePINs("repeat", firstPinInputField, repeatPinInputField);
}
}
StyledText {
anchors.horizontalCenter: parent.horizontalCenter
visible: userProfile.isKeycardUser
text: qsTr("Repeat PIN")
font.pixelSize: d.fontSize
}
StatusPinInput {
id: repeatPinInputField
anchors.horizontalCenter: parent.horizontalCenter
visible: userProfile.isKeycardUser
validator: StatusIntValidator{bottom: 0; top: 999999;}
pinLen: Constants.keycard.general.keycardPinLength
onPinInputChanged: {
[repeatPasswordFieldValid, repeatPasswordValidationError] =
Utils.validatePINs("repeat", firstPinInputField, repeatPinInputField);
}
}
StyledText {
id: validationError
text: {
if (passwordValidationError !== "") return passwordValidationError;
if (repeatPasswordValidationError !== "") return repeatPasswordValidationError;
return "";
}
anchors.horizontalCenter: parent.horizontalCenter
color: Style.current.danger
font.pixelSize: 11
2020-12-05 21:00:28 +00:00
}
}
2020-06-22 19:32:00 +00:00
footer: Item {
width: parent.width
height: submitBtn.height
2020-06-12 20:47:44 +00:00
StatusButton {
2020-06-22 19:32:00 +00:00
id: submitBtn
anchors.bottom: parent.bottom
anchors.topMargin: Style.current.padding
2020-06-22 19:32:00 +00:00
anchors.right: parent.right
state: loading ? "pending" : "default"
text: userProfile.isKeycardUser? qsTr("Store PIN") : qsTr("Store password")
2020-06-12 20:47:44 +00:00
enabled: firstPasswordFieldValid && repeatPasswordFieldValid && !loading
2020-06-22 19:32:00 +00:00
MessageDialog {
id: importError
title: qsTr("Error importing account")
text: qsTr("An error occurred while importing your account: ")
2020-06-22 19:32:00 +00:00
icon: StandardIcon.Critical
standardButtons: StandardButton.Ok
onVisibilityChanged: {
loading = false
}
2020-06-12 20:47:44 +00:00
}
2020-06-22 19:32:00 +00:00
MessageDialog {
id: importLoginError
title: qsTr("Login failed")
text: qsTr("Login failed. Please re-enter your password and try again.")
2020-06-22 19:32:00 +00:00
icon: StandardIcon.Critical
standardButtons: StandardButton.Ok
onVisibilityChanged: {
2020-06-12 20:47:44 +00:00
loading = false
}
}
onClicked: {
if (!userProfile.isKeycardUser) {
// validate the entered password
var validatePassword = privacyStore.validatePassword(repeatPasswordField.text)
if(!validatePassword) {
firstPasswordFieldValid = false
passwordValidationError = qsTr("Incorrect password")
}
else {
popup.offerToStorePassword(repeatPasswordField.text, true)
popup.close()
}
}
else {
popup.offerToStorePassword(repeatPinInputField.pinInput, true)
popup.close()
2020-06-22 19:32:00 +00:00
}
2020-06-12 20:47:44 +00:00
}
}
}
}