status-desktop/ui/app/AppLayouts/Profile/popups/ChangePasswordModal.qml

116 lines
3.6 KiB
QML
Raw Permalink Normal View History

2021-08-11 09:55:59 +00:00
import QtQuick 2.13
import QtQuick.Controls 2.13
import QtQuick.Layouts 1.12
import utils 1.0
import shared 1.0
import shared.views 1.0
import shared.panels 1.0
import shared.controls 1.0
import shared.stores 1.0
2021-08-11 09:55:59 +00:00
import StatusQ.Popups 0.1
import StatusQ.Controls 0.1
import StatusQ.Core.Theme 0.1
import "../views"
StatusModal {
id: root
property var privacyStore
signal passwordChanged()
function onChangePasswordResponse(success, errorMsg) {
if (success) {
if (Qt.platform.os === Constants.mac && localAccountSettings.storeToKeychainValue !== Constants.keychain.storedValue.never) {
localAccountSettings.storeToKeychainValue = Constants.keychain.storedValue.notNow;
2022-06-22 12:16:21 +00:00
}
passwordChanged()
2022-06-22 12:16:21 +00:00
}
else {
view.reset()
view.errorMsgText = errorMsg
console.warn("TODO: Display error message when change password action failure! ")
}
2022-06-22 12:16:21 +00:00
d.passwordProcessing = "";
submitBtn.loading = false;
}
2021-08-11 09:55:59 +00:00
QtObject {
id: d
2022-06-22 12:16:21 +00:00
// We temporarly store the password during "changePassword" call
// to store it to KeyChain after successfull change operation.
property string passwordProcessing: ""
function submit() {
submitBtn.loading = true
// ChangePassword operation blocks the UI so loading = true; will never have any affect until changePassword/createPassword is done.
// Getting around it with a small pause (timer) in order to get the desired behavior
pause.start()
}
}
Connections {
target: root.privacyStore.privacyModule
function onPasswordChanged(success: bool, errorMsg: string) {
onChangePasswordResponse(success, errorMsg)
}
2021-08-11 09:55:59 +00:00
}
width: 480
height: 546
closePolicy: submitBtn.loading? Popup.NoAutoClose : Popup.CloseOnEscape | Popup.CloseOnPressOutside
hasCloseButton: !submitBtn.loading
headerSettings.title: qsTr("Change password")
2021-08-11 09:55:59 +00:00
onOpened: view.reset()
2021-08-11 09:55:59 +00:00
PasswordView {
id: view
anchors {
fill: parent
topMargin: Style.current.padding
bottomMargin: Style.current.padding
leftMargin: Style.current.padding
rightMargin: Style.current.padding
}
passwordStrengthScoreFunction: RootStore.getPasswordStrengthScore
titleVisible: false
introText: qsTr("Change password used to unlock Status on this device & sign transactions.")
fixIntroTextWidth: true
createNewPsw: false
onReturnPressed: if(submitBtn.enabled) d.submit()
2021-08-11 09:55:59 +00:00
}
rightButtons: [
2021-08-11 09:55:59 +00:00
StatusButton {
id: submitBtn
objectName: "changePasswordModalSubmitButton"
text: qsTr("Change password and restart Status")
enabled: !submitBtn.loading && view.ready
property Timer sim: Timer {
id: pause
interval: 20
onTriggered: {
// Change current password call action to the backend
2022-06-22 12:16:21 +00:00
d.passwordProcessing = view.newPswText
root.privacyStore.changePassword(view.currentPswText, view.newPswText)
}
}
2021-08-11 09:55:59 +00:00
onClicked: { d.submit() }
2021-08-11 09:55:59 +00:00
}
]
// By clicking anywhere outside password entries fields or focusable element in the view, it is needed to check if passwords entered matches
MouseArea {
anchors.fill: parent
z: view.zBehind // Behind focusable components in the view
onClicked: { view.checkPasswordMatches() }
}
2021-08-11 09:55:59 +00:00
}