mirror of
https://github.com/status-im/status-desktop.git
synced 2025-02-13 07:06:58 +00:00
Move the onboarding/login state machine to the top level in main.qml, so that logout events can trigger new states. Add Loader to statemachine so that each component is lazy-loaded. Initial tests saved 50MB of memory on startup. Currently, logging out, then logging back in to the same or different account results in a doubling-up of chats/messages/wallet accounts. These need to be reset, however I need help doing that and it would delayed and blown out this PR further. This reset has been done for Onboarding and Login, but needs to be done for chats, wallet, mailservers, etc.
245 lines
6.8 KiB
QML
245 lines
6.8 KiB
QML
import QtQuick 2.3
|
|
import QtQuick.Controls 2.4
|
|
import QtQuick.Layouts 1.11
|
|
import QtQuick.Window 2.11
|
|
import QtQuick.Dialogs 1.3
|
|
import "../shared"
|
|
import "../imports"
|
|
|
|
SwipeView {
|
|
id: swipeView
|
|
anchors.fill: parent
|
|
currentIndex: 0
|
|
|
|
onCurrentItemChanged: {
|
|
currentItem.txtPassword.textField.focus = true;
|
|
}
|
|
|
|
Item {
|
|
id: wizardStep1
|
|
property Item txtPassword: txtMnemonic
|
|
width: 620
|
|
height: 427
|
|
|
|
Text {
|
|
id: title
|
|
text: "Enter mnemonic"
|
|
font.pointSize: 36
|
|
anchors.top: parent.top
|
|
anchors.topMargin: 20
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
}
|
|
|
|
Input {
|
|
id: txtMnemonic
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
anchors.rightMargin: Theme.padding
|
|
anchors.leftMargin: Theme.padding
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
placeholderText: "Enter 12, 15, 21 or 24 words. Separate words by a single space."
|
|
|
|
Keys.onReturnPressed: {
|
|
btnImport.clicked()
|
|
}
|
|
}
|
|
|
|
StyledButton {
|
|
id: btnImport
|
|
label: "Next"
|
|
anchors.bottom: parent.bottom
|
|
anchors.bottomMargin: Theme.padding
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
onClicked: {
|
|
onboardingModel.importMnemonic(txtMnemonic.textField.text);
|
|
swipeView.incrementCurrentIndex();
|
|
}
|
|
}
|
|
}
|
|
|
|
Item {
|
|
id: wizardStep2
|
|
property Item txtPassword: txtPassword
|
|
|
|
Text {
|
|
id: step2Title
|
|
text: "Enter password"
|
|
font.pointSize: 36
|
|
anchors.top: parent.top
|
|
anchors.topMargin: 20
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
}
|
|
|
|
Row {
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
anchors.top: step2Title.bottom
|
|
anchors.topMargin: 30
|
|
Column {
|
|
Image {
|
|
source: onboardingModel.currentAccount.identicon
|
|
}
|
|
}
|
|
Column {
|
|
Text {
|
|
text: onboardingModel.currentAccount.username
|
|
}
|
|
Text {
|
|
text: onboardingModel.currentAccount.address
|
|
width: 160
|
|
elide: Text.ElideMiddle
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
Input {
|
|
id: txtPassword
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
anchors.rightMargin: Theme.padding
|
|
anchors.leftMargin: Theme.padding
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
placeholderText: "Enter password"
|
|
|
|
Component.onCompleted: {
|
|
this.textField.echoMode = TextInput.Password
|
|
}
|
|
Keys.onReturnPressed: {
|
|
btnNext.clicked()
|
|
}
|
|
}
|
|
|
|
StyledButton {
|
|
id: btnNext
|
|
label: "Next"
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
anchors.bottom: parent.bottom
|
|
anchors.bottomMargin: 20
|
|
onClicked: {
|
|
swipeView.incrementCurrentIndex();
|
|
}
|
|
}
|
|
}
|
|
|
|
Item {
|
|
id: wizardStep3
|
|
property Item txtPassword: txtConfirmPassword
|
|
|
|
Text {
|
|
id: step3Title
|
|
text: "Confirm password"
|
|
font.pointSize: 36
|
|
anchors.top: parent.top
|
|
anchors.topMargin: 20
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
}
|
|
|
|
Row {
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
anchors.top: step3Title.bottom
|
|
anchors.topMargin: 30
|
|
Column {
|
|
Image {
|
|
source: onboardingModel.currentAccount.identicon
|
|
}
|
|
}
|
|
Column {
|
|
Text {
|
|
text: onboardingModel.currentAccount.username
|
|
}
|
|
Text {
|
|
text: onboardingModel.currentAccount.address
|
|
width: 160
|
|
elide: Text.ElideMiddle
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
Input {
|
|
id: txtConfirmPassword
|
|
anchors.verticalCenter: parent.verticalCenter
|
|
anchors.rightMargin: Theme.padding
|
|
anchors.leftMargin: Theme.padding
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
placeholderText: "Confirm entered password"
|
|
|
|
Component.onCompleted: {
|
|
this.textField.echoMode = TextInput.Password
|
|
}
|
|
Keys.onReturnPressed: {
|
|
btnFinish.clicked()
|
|
}
|
|
}
|
|
|
|
MessageDialog {
|
|
id: importError
|
|
title: "Error importing account"
|
|
text: "An error occurred while importing your account: "
|
|
icon: StandardIcon.Critical
|
|
standardButtons: StandardButton.Ok
|
|
onAccepted: {
|
|
swipeView.currentIndex = 0
|
|
}
|
|
}
|
|
|
|
MessageDialog {
|
|
id: importLoginError
|
|
title: "Login failed"
|
|
text: "Login failed. Please re-enter your password and try again."
|
|
icon: StandardIcon.Critical
|
|
standardButtons: StandardButton.Ok
|
|
}
|
|
|
|
MessageDialog {
|
|
id: passwordsDontMatchError
|
|
title: "Error"
|
|
text: "Passwords don't match"
|
|
icon: StandardIcon.Warning
|
|
standardButtons: StandardButton.Ok
|
|
onAccepted: {
|
|
txtConfirmPassword.clear();
|
|
swipeView.currentIndex = 1;
|
|
txtPassword.focus = true;
|
|
}
|
|
}
|
|
|
|
Connections {
|
|
target: onboardingModel
|
|
ignoreUnknownSignals: true
|
|
onLoginResponseChanged: {
|
|
if(error){
|
|
importLoginError.open()
|
|
}
|
|
}
|
|
}
|
|
|
|
StyledButton {
|
|
id: btnFinish
|
|
label: "Finish"
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
anchors.bottom: parent.bottom
|
|
anchors.bottomMargin: 20
|
|
onClicked: {
|
|
if (txtConfirmPassword.textField.text != txtPassword.textField.text) {
|
|
return passwordsDontMatchError.open();
|
|
}
|
|
const result = onboardingModel.storeDerivedAndLogin(txtConfirmPassword.textField.text);
|
|
const error = JSON.parse(result).error;
|
|
if (error) {
|
|
importError.text += error;
|
|
importError.open();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*##^##
|
|
Designer {
|
|
D{i:0;autoSize:true;height:480;width:640}
|
|
}
|
|
##^##*/
|
|
|