parent
768b10e03f
commit
dcab50fe09
|
@ -4,13 +4,15 @@ type
|
||||||
alias: string
|
alias: string
|
||||||
identicon: string
|
identicon: string
|
||||||
address: string
|
address: string
|
||||||
|
pubKey: string
|
||||||
keyUid: string
|
keyUid: string
|
||||||
|
|
||||||
proc initItem*(id, alias, identicon, address, keyUid: string): Item =
|
proc initItem*(id, alias, identicon, address, pubKey, keyUid: string): Item =
|
||||||
result.id = id
|
result.id = id
|
||||||
result.alias = alias
|
result.alias = alias
|
||||||
result.identicon = identicon
|
result.identicon = identicon
|
||||||
result.address = address
|
result.address = address
|
||||||
|
result.pubKey = pubKey
|
||||||
result.keyUid = keyUid
|
result.keyUid = keyUid
|
||||||
|
|
||||||
proc getId*(self: Item): string =
|
proc getId*(self: Item): string =
|
||||||
|
@ -25,5 +27,8 @@ proc getIdenticon*(self: Item): string =
|
||||||
proc getAddress*(self: Item): string =
|
proc getAddress*(self: Item): string =
|
||||||
return self.address
|
return self.address
|
||||||
|
|
||||||
|
proc getPubKey*(self: Item): string =
|
||||||
|
return self.pubKey
|
||||||
|
|
||||||
proc getKeyUid*(self: Item): string =
|
proc getKeyUid*(self: Item): string =
|
||||||
return self.keyUid
|
return self.keyUid
|
||||||
|
|
|
@ -8,6 +8,7 @@ type
|
||||||
Alias
|
Alias
|
||||||
Identicon
|
Identicon
|
||||||
Address
|
Address
|
||||||
|
PubKey
|
||||||
KeyUid
|
KeyUid
|
||||||
|
|
||||||
QtObject:
|
QtObject:
|
||||||
|
@ -35,6 +36,7 @@ QtObject:
|
||||||
ModelRole.Alias.int:"username",
|
ModelRole.Alias.int:"username",
|
||||||
ModelRole.Identicon.int:"identicon",
|
ModelRole.Identicon.int:"identicon",
|
||||||
ModelRole.Address.int:"address",
|
ModelRole.Address.int:"address",
|
||||||
|
ModelRole.PubKey.int:"pubKey",
|
||||||
ModelRole.KeyUid.int:"keyUid"
|
ModelRole.KeyUid.int:"keyUid"
|
||||||
}.toTable
|
}.toTable
|
||||||
|
|
||||||
|
@ -57,6 +59,8 @@ QtObject:
|
||||||
result = newQVariant(item.getIdenticon())
|
result = newQVariant(item.getIdenticon())
|
||||||
of ModelRole.Address:
|
of ModelRole.Address:
|
||||||
result = newQVariant(item.getAddress())
|
result = newQVariant(item.getAddress())
|
||||||
|
of ModelRole.PubKey:
|
||||||
|
result = newQVariant(item.getPubKey())
|
||||||
of ModelRole.KeyUid:
|
of ModelRole.KeyUid:
|
||||||
result = newQVariant(item.getKeyUid())
|
result = newQVariant(item.getKeyUid())
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ method load*(self: Module) =
|
||||||
let generatedAccounts = self.controller.getGeneratedAccounts()
|
let generatedAccounts = self.controller.getGeneratedAccounts()
|
||||||
var accounts: seq[Item]
|
var accounts: seq[Item]
|
||||||
for acc in generatedAccounts:
|
for acc in generatedAccounts:
|
||||||
accounts.add(initItem(acc.id, acc.alias, acc.identicon, acc.address, acc.keyUid))
|
accounts.add(initItem(acc.id, acc.alias, acc.identicon, acc.address, acc.publicKey, acc.keyUid))
|
||||||
|
|
||||||
self.view.setAccountList(accounts)
|
self.view.setAccountList(accounts)
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,13 @@ QtObject:
|
||||||
read = getImportedAccountAddress
|
read = getImportedAccountAddress
|
||||||
notify = importedAccountChanged
|
notify = importedAccountChanged
|
||||||
|
|
||||||
|
proc getImportedAccountPubKey*(self: View): string {.slot.} =
|
||||||
|
return self.delegate.getImportedAccount().publicKey
|
||||||
|
|
||||||
|
QtProperty[string] importedAccountPubKey:
|
||||||
|
read = getImportedAccountPubKey
|
||||||
|
notify = importedAccountChanged
|
||||||
|
|
||||||
proc setDisplayName*(self: View, displayName: string) {.slot.} =
|
proc setDisplayName*(self: View, displayName: string) {.slot.} =
|
||||||
self.delegate.setDisplayName(displayName)
|
self.delegate.setDisplayName(displayName)
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,8 @@ import "stores"
|
||||||
QtObject {
|
QtObject {
|
||||||
id: root
|
id: root
|
||||||
property bool hasAccounts
|
property bool hasAccounts
|
||||||
|
property string keysMainSetState: ""
|
||||||
|
|
||||||
signal loadApp()
|
signal loadApp()
|
||||||
signal onBoardingStepChanged(var view, string state)
|
signal onBoardingStepChanged(var view, string state)
|
||||||
|
|
||||||
|
@ -18,38 +20,78 @@ QtObject {
|
||||||
|
|
||||||
DSM.State {
|
DSM.State {
|
||||||
id: onboardingState
|
id: onboardingState
|
||||||
initialState: root.hasAccounts ? stateLogin : keysMainState
|
initialState: root.hasAccounts ? stateLogin : welcomeMainState
|
||||||
|
|
||||||
|
DSM.State {
|
||||||
|
id: welcomeMainState
|
||||||
|
onEntered: { onBoardingStepChanged(welcomeMain, ""); }
|
||||||
|
|
||||||
|
DSM.SignalTransition {
|
||||||
|
targetState: keysMainState
|
||||||
|
signal: Global.applicationWindow.navigateTo
|
||||||
|
guard: path === "KeyMain"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
DSM.State {
|
DSM.State {
|
||||||
id: keysMainState
|
id: keysMainState
|
||||||
onEntered: { onBoardingStepChanged(welcomeMain, ""); }
|
onEntered: { onBoardingStepChanged(keysMain, root.keysMainSetState); }
|
||||||
|
|
||||||
DSM.SignalTransition {
|
DSM.SignalTransition {
|
||||||
targetState: genKeyState
|
targetState: genKeyState
|
||||||
signal: Global.applicationWindow.navigateTo
|
signal: Global.applicationWindow.navigateTo
|
||||||
guard: path === "GenKey"
|
guard: path === "GenKey"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DSM.SignalTransition {
|
||||||
|
targetState: welcomeMainState
|
||||||
|
signal: Global.applicationWindow.navigateTo
|
||||||
|
guard: path === "Welcome"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DSM.State {
|
DSM.State {
|
||||||
id: existingKeyState
|
id: existingKeyState
|
||||||
onEntered: { onBoardingStepChanged(existingKey, ""); }
|
onEntered: { onBoardingStepChanged(existingKey, ""); }
|
||||||
|
|
||||||
|
DSM.SignalTransition {
|
||||||
|
targetState: genKeyState
|
||||||
|
signal: Global.applicationWindow.navigateTo
|
||||||
|
guard: path === "GenKey"
|
||||||
|
}
|
||||||
|
|
||||||
DSM.SignalTransition {
|
DSM.SignalTransition {
|
||||||
targetState: appState
|
targetState: appState
|
||||||
signal: startupModule.appStateChanged
|
signal: startupModule.appStateChanged
|
||||||
guard: state === Constants.appState.main
|
guard: state === Constants.appState.main
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DSM.SignalTransition {
|
||||||
|
targetState: welcomeMainState
|
||||||
|
signal: Global.applicationWindow.navigateTo
|
||||||
|
guard: path === "Welcome"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DSM.State {
|
DSM.State {
|
||||||
id: genKeyState
|
id: genKeyState
|
||||||
onEntered: { onBoardingStepChanged(genKey, ""); }
|
onEntered: { onBoardingStepChanged(genKey, ""); }
|
||||||
|
DSM.SignalTransition {
|
||||||
|
targetState: welcomeMainState
|
||||||
|
signal: Global.applicationWindow.navigateTo
|
||||||
|
guard: path === "Welcome"
|
||||||
|
}
|
||||||
|
|
||||||
DSM.SignalTransition {
|
DSM.SignalTransition {
|
||||||
targetState: appState
|
targetState: appState
|
||||||
signal: startupModule.appStateChanged
|
signal: Global.applicationWindow.navigateTo
|
||||||
guard: state === Constants.appState.main
|
guard: path === "LoggedIn"
|
||||||
|
}
|
||||||
|
|
||||||
|
DSM.SignalTransition {
|
||||||
|
targetState: stateLogin
|
||||||
|
signal: Global.applicationWindow.navigateTo
|
||||||
|
guard: path === "LogIn"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,36 +151,24 @@ QtObject {
|
||||||
guard: path === "InitialState"
|
guard: path === "InitialState"
|
||||||
}
|
}
|
||||||
|
|
||||||
DSM.SignalTransition {
|
|
||||||
targetState: existingKeyState
|
|
||||||
signal: Global.applicationWindow.navigateTo
|
|
||||||
guard: path === "ExistingKey"
|
|
||||||
}
|
|
||||||
|
|
||||||
DSM.SignalTransition {
|
DSM.SignalTransition {
|
||||||
targetState: keysMainState
|
targetState: keysMainState
|
||||||
signal: Global.applicationWindow.navigateTo
|
signal: Global.applicationWindow.navigateTo
|
||||||
guard: path === "KeysMain"
|
guard: path === "KeysMain"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DSM.SignalTransition {
|
||||||
|
targetState: existingKeyState
|
||||||
|
signal: Global.applicationWindow.navigateTo
|
||||||
|
guard: path === "ExistingKey"
|
||||||
|
}
|
||||||
|
|
||||||
DSM.SignalTransition {
|
DSM.SignalTransition {
|
||||||
targetState: keycardState
|
targetState: keycardState
|
||||||
signal: Global.applicationWindow.navigateTo
|
signal: Global.applicationWindow.navigateTo
|
||||||
guard: path === "KeycardFlowSelection"
|
guard: path === "KeycardFlowSelection"
|
||||||
}
|
}
|
||||||
|
|
||||||
DSM.SignalTransition {
|
|
||||||
targetState: createPasswordState
|
|
||||||
signal: applicationWindow.navigateTo
|
|
||||||
guard: path === "CreatePassword"
|
|
||||||
}
|
|
||||||
|
|
||||||
DSM.SignalTransition {
|
|
||||||
targetState: confirmPasswordState
|
|
||||||
signal: applicationWindow.navigateTo
|
|
||||||
guard: path === "ConfirmPassword"
|
|
||||||
}
|
|
||||||
|
|
||||||
DSM.FinalState {
|
DSM.FinalState {
|
||||||
id: onboardingDoneState
|
id: onboardingDoneState
|
||||||
}
|
}
|
||||||
|
@ -159,10 +189,12 @@ QtObject {
|
||||||
id: welcomeMain
|
id: welcomeMain
|
||||||
WelcomeView {
|
WelcomeView {
|
||||||
onBtnNewUserClicked: {
|
onBtnNewUserClicked: {
|
||||||
onBoardingStepChanged(keysMain, "getkeys");
|
root.keysMainSetState = "getkeys";
|
||||||
|
Global.applicationWindow.navigateTo("KeyMain");
|
||||||
}
|
}
|
||||||
onBtnExistingUserClicked: {
|
onBtnExistingUserClicked: {
|
||||||
onBoardingStepChanged(keysMain, "connectkeys");
|
root.keysMainSetState = "connectkeys";
|
||||||
|
Global.applicationWindow.navigateTo("KeyMain");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -180,7 +212,7 @@ QtObject {
|
||||||
Global.applicationWindow.navigateTo("ExistingKey");
|
Global.applicationWindow.navigateTo("ExistingKey");
|
||||||
}
|
}
|
||||||
onBackClicked: {
|
onBackClicked: {
|
||||||
onBoardingStepChanged(welcomeMain, "");
|
Global.applicationWindow.navigateTo("Welcome");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -188,7 +220,9 @@ QtObject {
|
||||||
property var existingKeyComponent: Component {
|
property var existingKeyComponent: Component {
|
||||||
id: existingKey
|
id: existingKey
|
||||||
ExistingKeyView {
|
ExistingKeyView {
|
||||||
onShowCreatePasswordView: { Global.applicationWindow.navigateTo("CreatePassword") }
|
onShowCreatePasswordView: {
|
||||||
|
Global.applicationWindow.navigateTo("GenKey");
|
||||||
|
}
|
||||||
onClosed: function () {
|
onClosed: function () {
|
||||||
if (root.hasAccounts) {
|
if (root.hasAccounts) {
|
||||||
Global.applicationWindow.navigateTo("InitialState")
|
Global.applicationWindow.navigateTo("InitialState")
|
||||||
|
@ -202,14 +236,16 @@ QtObject {
|
||||||
property var genKeyComponent: Component {
|
property var genKeyComponent: Component {
|
||||||
id: genKey
|
id: genKey
|
||||||
GenKeyView {
|
GenKeyView {
|
||||||
onShowCreatePasswordView: { Global.applicationWindow.navigateTo("CreatePassword") }
|
onFinished: {
|
||||||
onClosed: function () {
|
if (LoginStore.currentAccount.username !== "") {
|
||||||
if (root.hasAccounts) {
|
Global.applicationWindow.navigateTo("LogIn");
|
||||||
Global.applicationWindow.navigateTo("InitialState")
|
|
||||||
} else {
|
} else {
|
||||||
Global.applicationWindow.navigateTo("KeysMain")
|
Global.applicationWindow.navigateTo("KeysMain");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
onKeysGenerated: {
|
||||||
|
Global.applicationWindow.navigateTo("LoggedIn")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -237,39 +273,4 @@ QtObject {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
property var d: QtObject {
|
|
||||||
property string newPassword
|
|
||||||
property string confirmationPassword
|
|
||||||
}
|
|
||||||
|
|
||||||
property var createPasswordComponent: Component {
|
|
||||||
id: createPassword
|
|
||||||
CreatePasswordView {
|
|
||||||
store: OnboardingStore
|
|
||||||
newPassword: d.newPassword
|
|
||||||
confirmationPassword: d.confirmationPassword
|
|
||||||
|
|
||||||
onPasswordCreated: {
|
|
||||||
d.newPassword = newPassword
|
|
||||||
d.confirmationPassword = confirmationPassword
|
|
||||||
applicationWindow.navigateTo("ConfirmPassword")
|
|
||||||
}
|
|
||||||
onBackClicked: {
|
|
||||||
d.newPassword = ""
|
|
||||||
d.confirmationPassword = ""
|
|
||||||
applicationWindow.navigateTo("InitialState");
|
|
||||||
console.warn("TODO: Integration with onboarding flow!")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
property var confirmPasswordComponent: Component {
|
|
||||||
id: confirmPassword
|
|
||||||
ConfirmPasswordView {
|
|
||||||
password: d.newPassword
|
|
||||||
|
|
||||||
onBackClicked: { applicationWindow.navigateTo("CreatePassword") }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
import QtQuick 2.13
|
||||||
|
import QtQuick.Controls 2.13
|
||||||
|
|
||||||
|
import StatusQ.Controls 0.1
|
||||||
|
|
||||||
|
import utils 1.0
|
||||||
|
|
||||||
|
Page {
|
||||||
|
id: root
|
||||||
|
signal backClicked()
|
||||||
|
signal finished()
|
||||||
|
|
||||||
|
background: Rectangle {
|
||||||
|
color: Style.current.background
|
||||||
|
}
|
||||||
|
|
||||||
|
StatusRoundButton {
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.leftMargin: Style.current.padding
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.bottomMargin: Style.current.padding
|
||||||
|
icon.name: "arrow-left"
|
||||||
|
onClicked: {
|
||||||
|
root.backClicked();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -43,7 +43,7 @@ ModalPopup {
|
||||||
anchors.top: info.bottom
|
anchors.top: info.bottom
|
||||||
anchors.topMargin: Style.current.bigPadding
|
anchors.topMargin: Style.current.bigPadding
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
image.source: OnboardingStore.onBoardingModul.importedAccountIdenticon
|
image.source: OnboardingStore.onboardingModuleInst.importedAccountIdenticon
|
||||||
image.width: 60
|
image.width: 60
|
||||||
image.height: 60
|
image.height: 60
|
||||||
}
|
}
|
||||||
|
@ -53,7 +53,7 @@ ModalPopup {
|
||||||
anchors.top: identicon.bottom
|
anchors.top: identicon.bottom
|
||||||
anchors.topMargin: Style.current.padding
|
anchors.topMargin: Style.current.padding
|
||||||
anchors.horizontalCenter: identicon.horizontalCenter
|
anchors.horizontalCenter: identicon.horizontalCenter
|
||||||
text: OnboardingStore.onBoardingModul.importedAccountAlias
|
text: OnboardingStore.onboardingModuleInst.importedAccountAlias
|
||||||
font.weight: Font.Bold
|
font.weight: Font.Bold
|
||||||
font.pixelSize: 15
|
font.pixelSize: 15
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ ModalPopup {
|
||||||
anchors.top: username.bottom
|
anchors.top: username.bottom
|
||||||
anchors.topMargin: Style.current.halfPadding
|
anchors.topMargin: Style.current.halfPadding
|
||||||
anchors.horizontalCenter: username.horizontalCenter
|
anchors.horizontalCenter: username.horizontalCenter
|
||||||
text: OnboardingStore.onBoardingModul.importedAccountAddress
|
text: OnboardingStore.onboardingModuleInst.importedAccountAddress
|
||||||
width: 120
|
width: 120
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,98 @@
|
||||||
|
import QtQuick 2.13
|
||||||
|
import QtQuick.Dialogs 1.3
|
||||||
|
|
||||||
|
import utils 1.0
|
||||||
|
|
||||||
|
import StatusQ.Controls 0.1
|
||||||
|
|
||||||
|
import shared 1.0
|
||||||
|
import shared.panels 1.0
|
||||||
|
import shared.popups 1.0
|
||||||
|
|
||||||
|
import "../stores"
|
||||||
|
|
||||||
|
// TODO: replace with StatusModal
|
||||||
|
ModalPopup {
|
||||||
|
id: popup
|
||||||
|
title: qsTr("Upload profile picture")
|
||||||
|
property string selectedImage
|
||||||
|
property string uploadError
|
||||||
|
|
||||||
|
onSelectedImageChanged: {
|
||||||
|
if (!selectedImage) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
cropImageModal.open();
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
anchors.fill: parent
|
||||||
|
|
||||||
|
RoundedImage {
|
||||||
|
id: profilePic
|
||||||
|
source: selectedImage
|
||||||
|
width: 160
|
||||||
|
height: 160
|
||||||
|
anchors.verticalCenter: parent.verticalCenter
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
border.width: 1
|
||||||
|
border.color: Style.current.border
|
||||||
|
onClicked: imageDialog.open();
|
||||||
|
}
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
visible: !!uploadError
|
||||||
|
text: uploadError
|
||||||
|
anchors.left: parent.left
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.top: profilePic.bottom
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
font.pixelSize: 13
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
anchors.topMargin: 13
|
||||||
|
font.weight: Font.Thin
|
||||||
|
color: Style.current.danger
|
||||||
|
}
|
||||||
|
|
||||||
|
ImageCropperModal {
|
||||||
|
id: cropImageModal
|
||||||
|
selectedImage: popup.selectedImage
|
||||||
|
ratio: "1:1"
|
||||||
|
onCropFinished: {
|
||||||
|
OnboardingStore.uploadImage(selectedImage, aX, aY, bX, bY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
footer: Item {
|
||||||
|
width: parent.width
|
||||||
|
height: uploadBtn.height
|
||||||
|
|
||||||
|
StatusButton {
|
||||||
|
id: uploadBtn
|
||||||
|
text: !!selectedImage ? qsTr("Done") : qsTr("Upload")
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
onClicked: {
|
||||||
|
if (!!selectedImage) {
|
||||||
|
close();
|
||||||
|
} else {
|
||||||
|
imageDialog.open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
FileDialog {
|
||||||
|
id: imageDialog
|
||||||
|
title: qsTrId("please-choose-an-image")
|
||||||
|
folder: shortcuts.pictures
|
||||||
|
nameFilters: [
|
||||||
|
qsTrId("image-files----jpg---jpeg---png-")
|
||||||
|
]
|
||||||
|
onAccepted: {
|
||||||
|
selectedImage = imageDialog.fileUrls[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -10,6 +10,8 @@ import shared.panels 1.0
|
||||||
import shared.popups 1.0
|
import shared.popups 1.0
|
||||||
import shared.controls 1.0
|
import shared.controls 1.0
|
||||||
|
|
||||||
|
import "../stores"
|
||||||
|
|
||||||
// TODO: replace with StatusModal
|
// TODO: replace with StatusModal
|
||||||
ModalPopup {
|
ModalPopup {
|
||||||
property var privacyStore
|
property var privacyStore
|
||||||
|
@ -153,7 +155,7 @@ ModalPopup {
|
||||||
}
|
}
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: onboardingModule
|
target: OnboardingStore.onboardingModuleInst
|
||||||
onAccountSetupError: {
|
onAccountSetupError: {
|
||||||
importLoginError.open()
|
importLoginError.open()
|
||||||
}
|
}
|
||||||
|
@ -169,15 +171,15 @@ ModalPopup {
|
||||||
passwordValidationError = qsTr("Incorrect password")
|
passwordValidationError = qsTr("Incorrect password")
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Global.applicationWindow.prepareForStoring(repeatPasswordField.text, true)
|
//Global.applicationWindow.prepareForStoring(repeatPasswordField.text, true)
|
||||||
popup.close()
|
popup.close()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
loading = true
|
loading = true
|
||||||
onboardingModule.storeSelectedAccountAndLogin(repeatPasswordField.text);
|
OnboardingStore.onboardingModuleInst.storeSelectedAccountAndLogin(repeatPasswordField.text);
|
||||||
Global.applicationWindow.prepareForStoring(repeatPasswordField.text, false)
|
//Global.applicationWindow.prepareForStoring(repeatPasswordField.text, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,22 +1,69 @@
|
||||||
pragma Singleton
|
pragma Singleton
|
||||||
|
|
||||||
import QtQuick 2.13
|
import QtQuick 2.13
|
||||||
|
import utils 1.0
|
||||||
|
|
||||||
QtObject {
|
QtObject {
|
||||||
property var onBoardingModul: onboardingModule
|
id: root
|
||||||
|
property var profileSectionModuleInst: profileSectionModule
|
||||||
|
property var profileModule: profileSectionModuleInst.profileModule
|
||||||
|
property var onboardingModuleInst: onboardingModule
|
||||||
|
property var mainModuleInst: !!mainModule ? mainModule : undefined
|
||||||
|
property var accountSettings: localAccountSettings
|
||||||
|
property var privacyModule: profileSectionModuleInst.privacyModule
|
||||||
|
property string displayName: userProfile !== undefined ? userProfile.displayName : ""
|
||||||
|
|
||||||
|
property url profImgUrl: ""
|
||||||
|
property real profImgAX: 0.0
|
||||||
|
property real profImgAY: 0.0
|
||||||
|
property real profImgBX: 0.0
|
||||||
|
property real profImgBY: 0.0
|
||||||
|
property bool accountCreated: false
|
||||||
|
|
||||||
|
property bool showBeforeGetStartedPopup: true
|
||||||
|
|
||||||
function importMnemonic(mnemonic) {
|
function importMnemonic(mnemonic) {
|
||||||
onBoardingModul.importMnemonic(mnemonic)
|
onboardingModuleInst.importMnemonic(mnemonic)
|
||||||
}
|
}
|
||||||
|
|
||||||
function setCurrentAccountAndDisplayName(selectedAccountIdx, displayName) {
|
function setCurrentAccountAndDisplayName(selectedAccountIdx, displayName) {
|
||||||
onBoardingModul.setDisplayName(displayName)
|
onboardingModuleInst.setDisplayName(displayName)
|
||||||
onBoardingModul.setSelectedAccountByIndex(selectedAccountIdx)
|
onboardingModuleInst.setSelectedAccountByIndex(selectedAccountIdx)
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPasswordStrengthScore(password) {
|
function updatedDisplayName(displayName) {
|
||||||
let userName = onBoardingModul.importedAccountAlias
|
if (displayName !== root.displayName) {
|
||||||
return onBoardingModul.getPasswordStrengthScore(password, userName)
|
print(displayName, root.displayName)
|
||||||
|
root.profileModule.setDisplayName(displayName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveImage() {
|
||||||
|
root.profileModule.upload(root.profImgUrl, root.profImgAX, root.profImgAY, root.profImgBX, root.profImgBY);
|
||||||
|
}
|
||||||
|
|
||||||
|
function uploadImage(source, aX, aY, bX, bY) {
|
||||||
|
root.profImgUrl = source;
|
||||||
|
root.profImgAX = aX;
|
||||||
|
root.profImgAY = aY;
|
||||||
|
root.profImgBX = bX;
|
||||||
|
root.profImgBY = bY;
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeImage() {
|
||||||
|
return root.profileModule.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
function finishCreatingAccount(pass) {
|
||||||
|
root.onboardingModuleInst.storeSelectedAccountAndLogin(pass);
|
||||||
|
}
|
||||||
|
|
||||||
|
function storeToKeyChain(pass) {
|
||||||
|
mainModule.storePassword(pass);
|
||||||
|
}
|
||||||
|
|
||||||
|
function changePassword(password, newPassword) {
|
||||||
|
root.privacyModule.changePassword(password, newPassword)
|
||||||
}
|
}
|
||||||
|
|
||||||
property ListModel accountsSampleData: ListModel {
|
property ListModel accountsSampleData: ListModel {
|
||||||
|
|
|
@ -12,18 +12,15 @@ import StatusQ.Core 0.1
|
||||||
import StatusQ.Core.Theme 0.1
|
import StatusQ.Core.Theme 0.1
|
||||||
|
|
||||||
import "../stores"
|
import "../stores"
|
||||||
|
import "../controls"
|
||||||
|
|
||||||
Page {
|
OnboardingBasePage {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property string password
|
property string password
|
||||||
|
property string tmpPass
|
||||||
signal backClicked()
|
property string displayName
|
||||||
|
function forcePswInputFocus() { confPswInput.forceActiveFocus(Qt.MouseFocusReason)}
|
||||||
anchors.fill: parent
|
|
||||||
background: null
|
|
||||||
|
|
||||||
Component.onCompleted: confPswInput.forceActiveFocus(Qt.MouseFocusReason)
|
|
||||||
|
|
||||||
Column {
|
Column {
|
||||||
id: view
|
id: view
|
||||||
|
@ -73,9 +70,7 @@ Page {
|
||||||
|
|
||||||
width: parent.width
|
width: parent.width
|
||||||
enabled: !submitBtn.loading
|
enabled: !submitBtn.loading
|
||||||
placeholderText: submitBtn.loading ?
|
placeholderText: qsTr("Confirm you password (again)")
|
||||||
qsTr("Connecting...") :
|
|
||||||
qsTr("Confirm you password (again)")
|
|
||||||
textField.echoMode: showPassword ? TextInput.Normal : TextInput.Password
|
textField.echoMode: showPassword ? TextInput.Normal : TextInput.Password
|
||||||
textField.validator: RegExpValidator { regExp: /^[!-~]{0,64}$/ } // That incudes NOT extended ASCII printable characters less space and a maximum of 64 characters allowed
|
textField.validator: RegExpValidator { regExp: /^[!-~]{0,64}$/ } // That incudes NOT extended ASCII printable characters less space and a maximum of 64 characters allowed
|
||||||
keepHeight: true
|
keepHeight: true
|
||||||
|
@ -106,24 +101,34 @@ Page {
|
||||||
id: submitBtn
|
id: submitBtn
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
text: qsTr("Finalize Status Password Creation")
|
text: qsTr("Finalize Status Password Creation")
|
||||||
enabled: !submitBtn.loading && confPswInput.text === root.password
|
enabled:!submitBtn.loading && confPswInput.text === root.password
|
||||||
|
|
||||||
property Timer sim: Timer {
|
property Timer sim: Timer {
|
||||||
id: pause
|
id: pause
|
||||||
interval: 20
|
interval: 20
|
||||||
onTriggered: {
|
onTriggered: {
|
||||||
// Create new password call action to the backend
|
// Create account operation blocks the UI so loading = true; will never have any affect until it is done.
|
||||||
OnboardingStore.onBoardingModul.storeSelectedAccountAndLogin(root.password)
|
// Getting around it with a small pause (timer) in order to get the desired behavior
|
||||||
Global.applicationWindow.prepareForStoring(root.password, false)
|
OnboardingStore.finishCreatingAccount(root.password)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
confPswInput.text = ""
|
//confPswInput.text = ""
|
||||||
submitBtn.loading = true
|
if (OnboardingStore.accountCreated) {
|
||||||
// Create password operation blocks the UI so loading = true; will never have any affect until changePassword/createPassword is done.
|
if (root.password !== root.tmpPass) {
|
||||||
// Getting around it with a small pause (timer) in order to get the desired behavior
|
OnboardingStore.changePassword(root.tmpPass, root.password);
|
||||||
pause.start()
|
root.tmpPass = root.password;
|
||||||
|
} else {
|
||||||
|
submitBtn.loading = false
|
||||||
|
root.finished();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
root.tmpPass = root.password;
|
||||||
|
submitBtn.loading = true
|
||||||
|
OnboardingStore.setCurrentAccountAndDisplayName(0, root.displayName);
|
||||||
|
pause.start();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -138,4 +143,28 @@ Page {
|
||||||
icon.name: "arrow-left"
|
icon.name: "arrow-left"
|
||||||
onClicked: { root.backClicked() }
|
onClicked: { root.backClicked() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: startupModule
|
||||||
|
onAppStateChanged: {
|
||||||
|
if (state === Constants.appState.main) {
|
||||||
|
if (!!OnboardingStore.profImgUrl) {
|
||||||
|
OnboardingStore.saveImage()
|
||||||
|
OnboardingStore.accountCreated = true;
|
||||||
|
}
|
||||||
|
submitBtn.loading = false
|
||||||
|
root.finished()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: OnboardingStore.privacyModule
|
||||||
|
onPasswordChanged: {
|
||||||
|
if (success) {
|
||||||
|
submitBtn.loading = false
|
||||||
|
root.finished();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,28 +1,20 @@
|
||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
import QtQuick.Controls 2.13
|
import QtQuick.Controls 2.13
|
||||||
import QtQuick.Layouts 1.12
|
import QtQuick.Layouts 1.12
|
||||||
|
|
||||||
import StatusQ.Controls 0.1
|
import StatusQ.Controls 0.1
|
||||||
import StatusQ.Core.Theme 0.1
|
import StatusQ.Core.Theme 0.1
|
||||||
|
|
||||||
import utils 1.0
|
import utils 1.0
|
||||||
|
import shared.views 1.0
|
||||||
|
|
||||||
import "../../Profile/views"
|
import "../../Profile/views"
|
||||||
|
import "../controls"
|
||||||
|
|
||||||
Page {
|
OnboardingBasePage {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property var store
|
|
||||||
property string newPassword
|
property string newPassword
|
||||||
property string confirmationPassword
|
property string confirmationPassword
|
||||||
|
function forceNewPswInputFocus() { view.forceNewPswInputFocus() }
|
||||||
signal passwordCreated(string newPassword, string confirmationPassword)
|
|
||||||
signal backClicked()
|
|
||||||
|
|
||||||
anchors.fill: parent
|
|
||||||
background: null
|
|
||||||
|
|
||||||
Component.onCompleted: { view.forceNewPswInputFocus() }
|
|
||||||
|
|
||||||
QtObject {
|
QtObject {
|
||||||
id: d
|
id: d
|
||||||
|
@ -34,21 +26,23 @@ Page {
|
||||||
spacing: 4 * Style.current.padding
|
spacing: 4 * Style.current.padding
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
z: view.zFront
|
z: view.zFront
|
||||||
|
|
||||||
PasswordView {
|
PasswordView {
|
||||||
id: view
|
id: view
|
||||||
store: root.store
|
onboarding: true
|
||||||
newPswText: root.newPassword
|
newPswText: root.newPassword
|
||||||
confirmationPswText: root.confirmationPassword
|
confirmationPswText: root.confirmationPassword
|
||||||
}
|
}
|
||||||
|
|
||||||
StatusButton {
|
StatusButton {
|
||||||
id: submitBtn
|
id: submitBtn
|
||||||
z: d.zFront
|
z: d.zFront
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
text: qsTr("Create password")
|
text: qsTr("Create password")
|
||||||
enabled: view.ready
|
enabled: view.ready
|
||||||
onClicked: { passwordCreated(view.newPswText, view.confirmationPswText) }
|
onClicked: {
|
||||||
|
root.newPassword = view.newPswText
|
||||||
|
root.confirmationPassword = view.confirmationPswText
|
||||||
|
root.finished()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,7 +56,6 @@ Page {
|
||||||
icon.name: "arrow-left"
|
icon.name: "arrow-left"
|
||||||
onClicked: { root.backClicked() }
|
onClicked: { root.backClicked() }
|
||||||
}
|
}
|
||||||
|
|
||||||
// By clicking anywhere outside password entries fields or focusable element in the view, it is needed to check if passwords entered matches
|
// By clicking anywhere outside password entries fields or focusable element in the view, it is needed to check if passwords entered matches
|
||||||
MouseArea {
|
MouseArea {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
|
|
@ -1,33 +1,102 @@
|
||||||
import QtQuick 2.13
|
import QtQuick 2.13
|
||||||
|
import QtQuick.Controls 2.12
|
||||||
|
import QtQuick.Layouts 1.12
|
||||||
|
import StatusQ.Components 0.1
|
||||||
|
import StatusQ.Controls 0.1
|
||||||
|
import StatusQ.Core 0.1
|
||||||
|
import StatusQ.Core.Theme 0.1
|
||||||
|
|
||||||
import "../popups"
|
import shared.panels 1.0
|
||||||
|
|
||||||
|
import utils 1.0
|
||||||
|
|
||||||
|
import "../controls"
|
||||||
|
import "../panels"
|
||||||
import "../stores"
|
import "../stores"
|
||||||
import "../shared"
|
|
||||||
|
|
||||||
Item {
|
|
||||||
property var onClosed: function () {}
|
|
||||||
|
|
||||||
signal showCreatePasswordView()
|
OnboardingBasePage {
|
||||||
|
id: root
|
||||||
id: genKeyView
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
Behavior on opacity { NumberAnimation { duration: 200 }}
|
||||||
|
state: "username"
|
||||||
|
|
||||||
Component.onCompleted: {
|
signal keysGenerated()
|
||||||
genKeyModal.open()
|
|
||||||
|
function gotoKeysStack(stackIndex) { createKeysStack.currentIndex = stackIndex }
|
||||||
|
|
||||||
|
enum KeysStack {
|
||||||
|
DETAILS,
|
||||||
|
CREATE_PWD,
|
||||||
|
CONFRIM_PWD,
|
||||||
|
TOUCH_ID
|
||||||
}
|
}
|
||||||
|
|
||||||
GenKeyModal {
|
QtObject {
|
||||||
property bool wentNext: false
|
id: d
|
||||||
id: genKeyModal
|
|
||||||
onNextClick: function (selectedIndex, displayName) {
|
property string newPassword
|
||||||
wentNext = true
|
property string confirmationPassword
|
||||||
OnboardingStore.setCurrentAccountAndDisplayName(selectedIndex, displayName)
|
}
|
||||||
showCreatePasswordView()
|
|
||||||
|
StackLayout {
|
||||||
|
id: createKeysStack
|
||||||
|
anchors.fill: parent
|
||||||
|
currentIndex: GenKeyView.KeysStack.DETAILS
|
||||||
|
|
||||||
|
onCurrentIndexChanged: {
|
||||||
|
// Set focus:
|
||||||
|
if(currentIndex === GenKeyView.KeysStack.CREATE_PWD)
|
||||||
|
createPswView.forceNewPswInputFocus()
|
||||||
|
else if(currentIndex === GenKeyView.KeysStack.CONFRIM_PWD)
|
||||||
|
confirmPswView.forcePswInputFocus()
|
||||||
}
|
}
|
||||||
onClosed: function () {
|
|
||||||
if (!wentNext) {
|
InsertDetailsView {
|
||||||
genKeyView.onClosed()
|
id: userDetailsPanel
|
||||||
|
onCreatePassword: { gotoKeysStack(GenKeyView.KeysStack.CREATE_PWD) }
|
||||||
|
}
|
||||||
|
CreatePasswordView {
|
||||||
|
id: createPswView
|
||||||
|
newPassword: d.newPassword
|
||||||
|
confirmationPassword: d.confirmationPassword
|
||||||
|
|
||||||
|
onFinished: {
|
||||||
|
d.newPassword = newPassword
|
||||||
|
d.confirmationPassword = confirmationPassword
|
||||||
|
gotoKeysStack(GenKeyView.KeysStack.CONFRIM_PWD)
|
||||||
}
|
}
|
||||||
|
onBackClicked: {
|
||||||
|
d.newPassword = ""
|
||||||
|
d.confirmationPassword = ""
|
||||||
|
gotoKeysStack(GenKeyView.KeysStack.DETAILS)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ConfirmPasswordView {
|
||||||
|
id: confirmPswView
|
||||||
|
password: d.newPassword
|
||||||
|
displayName: userDetailsPanel.displayName
|
||||||
|
onFinished: {
|
||||||
|
if (Qt.platform.os == "osx") {
|
||||||
|
gotoKeysStack(GenKeyView.KeysStack.TOUCH_ID);
|
||||||
|
} else {
|
||||||
|
root.keysGenerated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onBackClicked: { gotoKeysStack(GenKeyView.KeysStack.CREATE_PWD) }
|
||||||
|
}
|
||||||
|
TouchIDAuthView {
|
||||||
|
userPass: d.newPassword
|
||||||
|
onBackClicked: { gotoKeysStack(GenKeyView.KeysStack.CONFRIM_PWD) }
|
||||||
|
onGenKeysDone: { root.keysGenerated() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onBackClicked: {
|
||||||
|
if (userDetailsPanel.state === "chatkey") {
|
||||||
|
userDetailsPanel.state = "username";
|
||||||
|
} else {
|
||||||
|
root.finished();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,251 @@
|
||||||
|
import QtQuick 2.13
|
||||||
|
import QtQuick.Layouts 1.12
|
||||||
|
import StatusQ.Components 0.1
|
||||||
|
import StatusQ.Controls 0.1
|
||||||
|
import StatusQ.Core 0.1
|
||||||
|
import StatusQ.Core.Theme 0.1
|
||||||
|
|
||||||
|
import shared.panels 1.0
|
||||||
|
|
||||||
|
import utils 1.0
|
||||||
|
import shared.controls 1.0
|
||||||
|
import "../popups"
|
||||||
|
import "../stores"
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
property string pubKey
|
||||||
|
property string address
|
||||||
|
property string displayName
|
||||||
|
signal createPassword()
|
||||||
|
|
||||||
|
state: "username"
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
id: accountsList
|
||||||
|
model: OnboardingStore.onboardingModuleInst.accountsModel
|
||||||
|
delegate: Item {
|
||||||
|
Component.onCompleted: {
|
||||||
|
root.pubKey = model.pubKey;
|
||||||
|
root.address = model.address;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
spacing: Style.current.padding
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
id: usernameText
|
||||||
|
text: qsTr("Your profile")
|
||||||
|
font.weight: Font.Bold
|
||||||
|
font.pixelSize: 22
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
}
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
id: txtDesc
|
||||||
|
Layout.preferredWidth: (root.state === "username") ? 338 : 643
|
||||||
|
color: Style.current.secondaryText
|
||||||
|
text: qsTr("Longer and unusual names are better as they are less likely to be used by someone else.")
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
font.pixelSize: 15
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
implicitWidth: 100
|
||||||
|
implicitHeight: 100
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
StatusSmartIdenticon {
|
||||||
|
id: userImage
|
||||||
|
image.width: 80
|
||||||
|
image.height: 80
|
||||||
|
icon.width: 80
|
||||||
|
icon.height: 80
|
||||||
|
icon.letterSize: 32
|
||||||
|
icon.color: Theme.palette.miscColor5
|
||||||
|
icon.charactersLen: 2
|
||||||
|
image.isIdenticon: false
|
||||||
|
image.source: uploadProfilePicPopup.selectedImage
|
||||||
|
ringSettings { ringSpecModel: Utils.getColorHashAsJson(root.pubKey) }
|
||||||
|
}
|
||||||
|
StatusRoundButton {
|
||||||
|
id: updatePicButton
|
||||||
|
width: 40
|
||||||
|
height: 40
|
||||||
|
anchors.top: parent.top
|
||||||
|
anchors.right: parent.right
|
||||||
|
type: StatusFlatRoundButton.Type.Secondary
|
||||||
|
icon.name: "add"
|
||||||
|
onClicked: {
|
||||||
|
uploadProfilePicPopup.open();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StatusInput {
|
||||||
|
id: nameInput
|
||||||
|
implicitWidth: 328
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
input.placeholderText: qsTr("Display name")
|
||||||
|
input.edit.font.capitalization: Font.Capitalize
|
||||||
|
input.rightComponent: RoundedIcon {
|
||||||
|
width: 14
|
||||||
|
height: 14
|
||||||
|
iconWidth: 14
|
||||||
|
iconHeight: 14
|
||||||
|
color: "transparent"
|
||||||
|
source: Style.svg("close-filled")
|
||||||
|
onClicked: {
|
||||||
|
nameInput.input.edit.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
onTextChanged: {
|
||||||
|
userImage.name = text;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
id: chatKeyTxt
|
||||||
|
color: Style.current.secondaryText
|
||||||
|
text: "Chatkey:" + root.address
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
font.pixelSize: 15
|
||||||
|
}
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: chainsChatKeyImg
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
Layout.preferredWidth: 181
|
||||||
|
Layout.preferredHeight: 84
|
||||||
|
Image {
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
source: Style.png("onboarding/chains")
|
||||||
|
}
|
||||||
|
EmojiHash {
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
publicKey: root.pubKey
|
||||||
|
}
|
||||||
|
StatusSmartIdenticon {
|
||||||
|
id: userImageCopy
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.right: parent.right
|
||||||
|
icon.width: 44
|
||||||
|
icon.height: 44
|
||||||
|
icon.color: "transparent"
|
||||||
|
ringSettings { ringSpecModel: Utils.getColorHashAsJson(root.pubKey) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
StatusButton {
|
||||||
|
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
|
||||||
|
Layout.topMargin: 125
|
||||||
|
enabled: !!nameInput.text
|
||||||
|
text: qsTr("Next")
|
||||||
|
onClicked: {
|
||||||
|
if (root.state === "username") {
|
||||||
|
if (OnboardingStore.accountCreated) {
|
||||||
|
OnboardingStore.updatedDisplayName(nameInput.text);
|
||||||
|
}
|
||||||
|
root.displayName = nameInput.text;
|
||||||
|
root.state = "chatkey";
|
||||||
|
} else {
|
||||||
|
createPassword();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
UploadProfilePicModal {
|
||||||
|
id: uploadProfilePicPopup
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
states: [
|
||||||
|
State {
|
||||||
|
name: "username"
|
||||||
|
PropertyChanges {
|
||||||
|
target: usernameText
|
||||||
|
text: qsTr("Your profile")
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: txtDesc
|
||||||
|
text: qsTr("Longer and unusual names are better as they are less likely to be used by someone else.")
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: chatKeyTxt
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: chainsChatKeyImg
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: userImageCopy
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: updatePicButton
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: nameInput
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
State {
|
||||||
|
name: "chatkey"
|
||||||
|
PropertyChanges {
|
||||||
|
target: usernameText
|
||||||
|
text: qsTr("Your emojihash and identicon ring")
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: txtDesc
|
||||||
|
text: qsTr("This set of emojis and coloured ring around your avatar are unique and represent your chat key, so your friends can easily distinguish you from potential impersonators.")
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: chatKeyTxt
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: chainsChatKeyImg
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: userImageCopy
|
||||||
|
visible: true
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: updatePicButton
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
PropertyChanges {
|
||||||
|
target: nameInput
|
||||||
|
visible: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
transitions: [
|
||||||
|
Transition {
|
||||||
|
from: "*"
|
||||||
|
to: "*"
|
||||||
|
SequentialAnimation {
|
||||||
|
PropertyAction {
|
||||||
|
target: root
|
||||||
|
property: "opacity"
|
||||||
|
value: 0.0
|
||||||
|
}
|
||||||
|
PropertyAction {
|
||||||
|
target: root
|
||||||
|
property: "opacity"
|
||||||
|
value: 1.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -10,31 +10,16 @@ import StatusQ.Core.Theme 0.1
|
||||||
import shared 1.0
|
import shared 1.0
|
||||||
import shared.panels 1.0
|
import shared.panels 1.0
|
||||||
import "../popups"
|
import "../popups"
|
||||||
|
import "../controls"
|
||||||
|
|
||||||
import utils 1.0
|
import utils 1.0
|
||||||
|
|
||||||
Page {
|
OnboardingBasePage {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
signal buttonClicked()
|
signal buttonClicked()
|
||||||
signal keycardLinkClicked()
|
signal keycardLinkClicked()
|
||||||
signal seedLinkClicked()
|
signal seedLinkClicked()
|
||||||
signal backClicked()
|
|
||||||
|
|
||||||
background: Rectangle {
|
|
||||||
color: Style.current.background
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
|
||||||
if(displayBeforeGetStartedModal) {
|
|
||||||
displayBeforeGetStartedModal = false
|
|
||||||
beforeGetStartedModal.open()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BeforeGetStartedModal {
|
|
||||||
id: beforeGetStartedModal
|
|
||||||
}
|
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
id: container
|
id: container
|
||||||
|
@ -141,17 +126,6 @@ Page {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
StatusRoundButton {
|
|
||||||
anchors.left: parent.left
|
|
||||||
anchors.leftMargin: Style.current.padding
|
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
anchors.bottomMargin: Style.current.padding
|
|
||||||
icon.name: "arrow-left"
|
|
||||||
onClicked: {
|
|
||||||
root.backClicked();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
states: [
|
states: [
|
||||||
State {
|
State {
|
||||||
name: "connectkeys"
|
name: "connectkeys"
|
||||||
|
@ -168,6 +142,7 @@ Page {
|
||||||
PropertyChanges {
|
PropertyChanges {
|
||||||
target: button
|
target: button
|
||||||
text: qsTr("Scan sync code")
|
text: qsTr("Scan sync code")
|
||||||
|
enabled: false
|
||||||
|
|
||||||
}
|
}
|
||||||
PropertyChanges {
|
PropertyChanges {
|
||||||
|
|
|
@ -31,7 +31,6 @@ Item {
|
||||||
|
|
||||||
loading = true
|
loading = true
|
||||||
LoginStore.login(password)
|
LoginStore.login(password)
|
||||||
Global.applicationWindow.prepareForStoring(password, false)
|
|
||||||
txtPassword.textField.clear()
|
txtPassword.textField.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,129 @@
|
||||||
|
import QtQuick 2.13
|
||||||
|
import QtQuick.Controls 2.12
|
||||||
|
import QtQuick.Layouts 1.12
|
||||||
|
import StatusQ.Components 0.1
|
||||||
|
import StatusQ.Controls 0.1
|
||||||
|
import StatusQ.Core 0.1
|
||||||
|
import StatusQ.Core.Theme 0.1
|
||||||
|
|
||||||
|
import shared.panels 1.0
|
||||||
|
|
||||||
|
import utils 1.0
|
||||||
|
|
||||||
|
import "../controls"
|
||||||
|
import "../panels"
|
||||||
|
import "../stores"
|
||||||
|
|
||||||
|
OnboardingBasePage {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
property string userPass
|
||||||
|
signal genKeysDone();
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: container
|
||||||
|
enabled: !dimBackground.active
|
||||||
|
anchors.centerIn: parent
|
||||||
|
width: 425
|
||||||
|
height: {
|
||||||
|
let h = 0
|
||||||
|
const children = this.children
|
||||||
|
Object.keys(children).forEach(function (key) {
|
||||||
|
const child = children[key]
|
||||||
|
h += child.height + Style.current.padding
|
||||||
|
})
|
||||||
|
return h
|
||||||
|
}
|
||||||
|
Image {
|
||||||
|
id: keysImg
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
anchors.top: parent.top
|
||||||
|
fillMode: Image.PreserveAspectFit
|
||||||
|
source: Style.png("onboarding/fingerprint")
|
||||||
|
width: 160
|
||||||
|
height: 160
|
||||||
|
mipmap: true
|
||||||
|
}
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
id: txtTitle
|
||||||
|
text: qsTr("Biometrics")
|
||||||
|
anchors.topMargin: Style.current.padding
|
||||||
|
font.bold: true
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
anchors.top: keysImg.bottom
|
||||||
|
font.letterSpacing: -0.2
|
||||||
|
font.pixelSize: 22
|
||||||
|
}
|
||||||
|
|
||||||
|
StyledText {
|
||||||
|
id: txtDesc
|
||||||
|
width: 426
|
||||||
|
anchors.top: txtTitle.bottom
|
||||||
|
anchors.topMargin: Style.current.padding
|
||||||
|
color: Style.current.secondaryText
|
||||||
|
text: qsTrId("Would you like to use your TouchID to login to Status?")
|
||||||
|
horizontalAlignment: Text.AlignHCenter
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
font.pixelSize: 15
|
||||||
|
}
|
||||||
|
ColumnLayout {
|
||||||
|
anchors.topMargin: 40
|
||||||
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
|
anchors.top: txtDesc.bottom
|
||||||
|
spacing: Style.current.bigPadding
|
||||||
|
StatusButton {
|
||||||
|
id: button
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
text: qsTr("Yes, use TouchID ")
|
||||||
|
onClicked: {
|
||||||
|
OnboardingStore.accountSettings.storeToKeychainValue = Constants.storeToKeychainValueStore;
|
||||||
|
dimBackground.active = true;
|
||||||
|
OnboardingStore.storeToKeyChain(userPass);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
StatusBaseText {
|
||||||
|
id: keycardLink
|
||||||
|
Layout.alignment: Qt.AlignHCenter
|
||||||
|
color: Theme.palette.primaryColor1
|
||||||
|
text: qsTr("I prefer to use my PIN")
|
||||||
|
MouseArea {
|
||||||
|
anchors.fill: parent
|
||||||
|
cursorShape: Qt.PointingHandCursor
|
||||||
|
hoverEnabled: true
|
||||||
|
onEntered: {
|
||||||
|
parent.font.underline = true
|
||||||
|
}
|
||||||
|
onExited: {
|
||||||
|
parent.font.underline = false
|
||||||
|
}
|
||||||
|
onClicked: {
|
||||||
|
OnboardingStore.accountSettings.storeToKeychainValue = Constants.storeToKeychainValueNever;
|
||||||
|
root.genKeysDone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Loader {
|
||||||
|
id: dimBackground
|
||||||
|
anchors.fill: parent
|
||||||
|
active: false
|
||||||
|
sourceComponent: Rectangle {
|
||||||
|
color: Qt.rgba(0, 0, 0, 0.4)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
enabled: !!OnboardingStore.mainModuleInst
|
||||||
|
target: OnboardingStore.mainModuleInst
|
||||||
|
onStoringPasswordSuccess: {
|
||||||
|
dimBackground.active = false;
|
||||||
|
root.genKeysDone();
|
||||||
|
}
|
||||||
|
onStoringPasswordError: {
|
||||||
|
dimBackground.active = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ import StatusQ.Controls 0.1
|
||||||
import shared 1.0
|
import shared 1.0
|
||||||
import shared.panels 1.0
|
import shared.panels 1.0
|
||||||
import "../popups"
|
import "../popups"
|
||||||
|
import "../stores"
|
||||||
|
|
||||||
import utils 1.0
|
import utils 1.0
|
||||||
|
|
||||||
|
@ -21,14 +22,16 @@ Page {
|
||||||
}
|
}
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
if(displayBeforeGetStartedModal) {
|
if (OnboardingStore.showBeforeGetStartedPopup) {
|
||||||
displayBeforeGetStartedModal = false
|
beforeGetStartedModal.open();
|
||||||
beforeGetStartedModal.open()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BeforeGetStartedModal {
|
BeforeGetStartedModal {
|
||||||
id: beforeGetStartedModal
|
id: beforeGetStartedModal
|
||||||
|
onClosed: {
|
||||||
|
OnboardingStore.showBeforeGetStartedPopup = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Item {
|
Item {
|
||||||
|
@ -52,7 +55,7 @@ Page {
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
anchors.top: parent.top
|
anchors.top: parent.top
|
||||||
fillMode: Image.PreserveAspectFit
|
fillMode: Image.PreserveAspectFit
|
||||||
source: Style.png("welcome")
|
source: Style.png("onboarding/welcome")
|
||||||
width: 256
|
width: 256
|
||||||
height: 256
|
height: 256
|
||||||
mipmap: true
|
mipmap: true
|
||||||
|
|
|
@ -5,6 +5,7 @@ import QtQuick.Layouts 1.12
|
||||||
|
|
||||||
import utils 1.0
|
import utils 1.0
|
||||||
import shared 1.0
|
import shared 1.0
|
||||||
|
import shared.views 1.0
|
||||||
import shared.panels 1.0
|
import shared.panels 1.0
|
||||||
import shared.controls 1.0
|
import shared.controls 1.0
|
||||||
|
|
||||||
|
@ -45,7 +46,6 @@ StatusModal {
|
||||||
|
|
||||||
PasswordView {
|
PasswordView {
|
||||||
id: view
|
id: view
|
||||||
store: root.privacyStore
|
|
||||||
anchors.topMargin: Style.current.padding
|
anchors.topMargin: Style.current.padding
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
titleVisible: false
|
titleVisible: false
|
||||||
|
|
|
@ -58,7 +58,9 @@ ModalPopup {
|
||||||
checked: localAccountSettings.storeToKeychainValue === Constants.storeToKeychainValueStore
|
checked: localAccountSettings.storeToKeychainValue === Constants.storeToKeychainValueStore
|
||||||
onCheckedChanged: {
|
onCheckedChanged: {
|
||||||
if (checked && localAccountSettings.storeToKeychainValue !== Constants.storeToKeychainValueStore) {
|
if (checked && localAccountSettings.storeToKeychainValue !== Constants.storeToKeychainValueStore) {
|
||||||
// TODO: REFACTOR TO NEW PASWORD VIEW
|
// TODO: REFACTOR TO NEW PASWORD VIEW AND
|
||||||
|
// DELETE StoreToKeychainSelectionModal.qml
|
||||||
|
// AND CreatePasswordModal.qml IF NOT NEEDED
|
||||||
var storePassPopup = Global.openPopup(storePasswordModal)
|
var storePassPopup = Global.openPopup(storePasswordModal)
|
||||||
if(storePassPopup)
|
if(storePassPopup)
|
||||||
{
|
{
|
||||||
|
|
|
@ -28,8 +28,4 @@ QtObject {
|
||||||
function validatePassword(password) {
|
function validatePassword(password) {
|
||||||
return root.privacyModule.validatePassword(password)
|
return root.privacyModule.validatePassword(password)
|
||||||
}
|
}
|
||||||
|
|
||||||
function getPasswordStrengthScore(password) {
|
|
||||||
return root.privacyModule.getPasswordStrengthScore(password)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
Binary file not shown.
After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
|
@ -0,0 +1,24 @@
|
||||||
|
import QtQuick 2.13
|
||||||
|
import StatusQ.Core.Utils 0.1 as StatusQUtils
|
||||||
|
import utils 1.0
|
||||||
|
|
||||||
|
Text {
|
||||||
|
id: root
|
||||||
|
property string publicKey
|
||||||
|
property string size: "14x14"
|
||||||
|
renderType: Text.NativeRendering
|
||||||
|
font.pointSize: 1 // make sure there is no padding for emojis due to 'style: "vertical-align: top"'
|
||||||
|
text: {
|
||||||
|
const emojiHash = Utils.getEmojiHashAsJson(root.publicKey);
|
||||||
|
var emojiHashFirstLine = "";
|
||||||
|
var emojiHashSecondLine = "";
|
||||||
|
for (var i = 0; i < 7; i++) {
|
||||||
|
emojiHashFirstLine += emojiHash[i];
|
||||||
|
}
|
||||||
|
for (var j = 7; j < emojiHash.length; j++) {
|
||||||
|
emojiHashSecondLine += emojiHash[j];
|
||||||
|
}
|
||||||
|
return StatusQUtils.Emoji.parse(emojiHashFirstLine, size) + "<br>" +
|
||||||
|
StatusQUtils.Emoji.parse(emojiHashSecondLine, size)
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,6 +3,7 @@ import QtQuick.Layouts 1.14
|
||||||
|
|
||||||
import utils 1.0
|
import utils 1.0
|
||||||
import shared.panels 1.0
|
import shared.panels 1.0
|
||||||
|
import shared.controls 1.0
|
||||||
|
|
||||||
import StatusQ.Components 0.1
|
import StatusQ.Components 0.1
|
||||||
import StatusQ.Core.Utils 0.1 as StatusQUtils
|
import StatusQ.Core.Utils 0.1 as StatusQUtils
|
||||||
|
@ -88,33 +89,14 @@ Item {
|
||||||
color: Style.current.secondaryText
|
color: Style.current.secondaryText
|
||||||
}
|
}
|
||||||
|
|
||||||
Text {
|
EmojiHash {
|
||||||
id: emojihash
|
id: emojihash
|
||||||
|
|
||||||
readonly property size finalSize: supersampling ? Qt.size(emojiSize.width * 2, emojiSize.height * 2) : emojiSize
|
|
||||||
property string size: `${finalSize.width}x${finalSize.height}`
|
|
||||||
|
|
||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
renderType: Text.NativeRendering
|
|
||||||
scale: supersampling ? 0.5 : 1
|
|
||||||
|
|
||||||
text: {
|
|
||||||
const emojiHash = Utils.getEmojiHashAsJson(root.pubkey)
|
|
||||||
var emojiHashFirstLine = ""
|
|
||||||
var emojiHashSecondLine = ""
|
|
||||||
for (var i = 0; i < 7; i++) {
|
|
||||||
emojiHashFirstLine += emojiHash[i]
|
|
||||||
}
|
|
||||||
for (var i = 7; i < emojiHash.length; i++) {
|
|
||||||
emojiHashSecondLine += emojiHash[i]
|
|
||||||
}
|
|
||||||
|
|
||||||
return StatusQUtils.Emoji.parse(emojiHashFirstLine, size) + "<br>" +
|
|
||||||
StatusQUtils.Emoji.parse(emojiHashSecondLine, size)
|
|
||||||
}
|
|
||||||
|
|
||||||
horizontalAlignment: Text.AlignHCenter
|
horizontalAlignment: Text.AlignHCenter
|
||||||
font.pointSize: 1 // make sure there is no padding for emojis due to 'style: "vertical-align: top"'
|
publicKey: root.pubkey
|
||||||
|
readonly property size finalSize: supersampling ? Qt.size(emojiSize.width * 2, emojiSize.height * 2) : emojiSize
|
||||||
|
size: `${finalSize.width}x${finalSize.height}`
|
||||||
|
scale: supersampling ? 0.5 : 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,3 +23,4 @@ StyledTextEdit 1.0 StyledTextEdit.qml
|
||||||
StyledTextField 1.0 StyledTextField.qml
|
StyledTextField 1.0 StyledTextField.qml
|
||||||
Timer 1.0 Timer.qml
|
Timer 1.0 Timer.qml
|
||||||
TransactionFormGroup 1.0 TransactionFormGroup.qml
|
TransactionFormGroup 1.0 TransactionFormGroup.qml
|
||||||
|
EmojiHash 1.0 EmojiHash.qml
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import QtQuick 2.3
|
import QtQuick 2.13
|
||||||
import QtGraphicalEffects 1.13
|
import QtGraphicalEffects 1.13
|
||||||
|
|
||||||
import StatusQ.Components 0.1
|
import StatusQ.Components 0.1
|
||||||
|
@ -53,7 +53,8 @@ Rectangle {
|
||||||
]
|
]
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: mainModule
|
enabled: !!mainModule
|
||||||
|
target: enabled ? mainModule : undefined
|
||||||
onOnlineStatusChanged: {
|
onOnlineStatusChanged: {
|
||||||
if (connected && root.state !== "ready" &&
|
if (connected && root.state !== "ready" &&
|
||||||
root.visible &&
|
root.visible &&
|
||||||
|
|
|
@ -10,6 +10,9 @@ QtObject {
|
||||||
// property var keycardModelInst: !!keycardModel ? keycardModel : null
|
// property var keycardModelInst: !!keycardModel ? keycardModel : null
|
||||||
// property var profileModelInst: !!profileModel ? profileModel : null
|
// property var profileModelInst: !!profileModel ? profileModel : null
|
||||||
|
|
||||||
|
property var profileSectionModuleInst: profileSectionModule
|
||||||
|
property var privacyModule: profileSectionModuleInst.privacyModule
|
||||||
|
property var onboardingModuleInst: onboardingModule
|
||||||
property var userProfileInst: !!userProfile ? userProfile : null
|
property var userProfileInst: !!userProfile ? userProfile : null
|
||||||
property var walletSectionInst: !!walletSection ? walletSection : null
|
property var walletSectionInst: !!walletSection ? walletSection : null
|
||||||
property var appSettings: !!localAppSettings ? localAppSettings : null
|
property var appSettings: !!localAppSettings ? localAppSettings : null
|
||||||
|
@ -97,4 +100,13 @@ QtObject {
|
||||||
function addToRecentsGif(id) {
|
function addToRecentsGif(id) {
|
||||||
chatSectionChatContentInputArea.addToRecentsGif(id)
|
chatSectionChatContentInputArea.addToRecentsGif(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getPasswordStrengthScore(password, onboarding = false) {
|
||||||
|
if (onboarding) {
|
||||||
|
let userName = root.onboardingModuleInst.importedAccountAlias;
|
||||||
|
return root.onboardingModuleInst.getPasswordStrengthScore(password, userName);
|
||||||
|
} else {
|
||||||
|
return root.privacyModule.getPasswordStrengthScore(password);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import QtQuick.Layouts 1.12
|
||||||
|
|
||||||
import shared.panels 1.0
|
import shared.panels 1.0
|
||||||
import shared.controls 1.0
|
import shared.controls 1.0
|
||||||
|
import shared.stores 1.0
|
||||||
import utils 1.0
|
import utils 1.0
|
||||||
|
|
||||||
import StatusQ.Controls 0.1
|
import StatusQ.Controls 0.1
|
||||||
|
@ -13,7 +14,6 @@ import StatusQ.Components 0.1
|
||||||
Column {
|
Column {
|
||||||
id: root
|
id: root
|
||||||
|
|
||||||
property var store
|
|
||||||
property bool ready: newPswInput.text.length >= root.minPswLen && newPswInput.text === confirmPswInput.text && errorTxt.text === ""
|
property bool ready: newPswInput.text.length >= root.minPswLen && newPswInput.text === confirmPswInput.text && errorTxt.text === ""
|
||||||
property int minPswLen: 6
|
property int minPswLen: 6
|
||||||
property bool createNewPsw: true
|
property bool createNewPsw: true
|
||||||
|
@ -22,6 +22,7 @@ Column {
|
||||||
property string introText: qsTr("Create a password to unlock Status on this device & sign transactions.")
|
property string introText: qsTr("Create a password to unlock Status on this device & sign transactions.")
|
||||||
property string recoverText: qsTr("You will not be able to recover this password if it is lost.")
|
property string recoverText: qsTr("You will not be able to recover this password if it is lost.")
|
||||||
property string strengthenText: qsTr("Minimum 6 characers. To strengthen your password consider including:")
|
property string strengthenText: qsTr("Minimum 6 characers. To strengthen your password consider including:")
|
||||||
|
property bool onboarding: false
|
||||||
|
|
||||||
readonly property int zBehind: 1
|
readonly property int zBehind: 1
|
||||||
readonly property int zFront: 100
|
readonly property int zFront: 100
|
||||||
|
@ -208,7 +209,7 @@ Column {
|
||||||
d.containsSymbols = d.symbolsValidator(text)
|
d.containsSymbols = d.symbolsValidator(text)
|
||||||
|
|
||||||
// Update strength indicator:
|
// Update strength indicator:
|
||||||
strengthInditactor.strength = d.convertStrength(root.store.getPasswordStrengthScore(newPswInput.text))
|
strengthInditactor.strength = d.convertStrength(RootStore.getPasswordStrengthScore(newPswInput.text, root.onboarding))
|
||||||
}
|
}
|
||||||
|
|
||||||
StatusFlatRoundButton {
|
StatusFlatRoundButton {
|
|
@ -5,3 +5,4 @@ SearchResults 1.0 SearchResults.qml
|
||||||
TransactionPreview 1.0 TransactionPreview.qml
|
TransactionPreview 1.0 TransactionPreview.qml
|
||||||
TransactionSigner 1.0 TransactionSigner.qml
|
TransactionSigner 1.0 TransactionSigner.qml
|
||||||
TransactionStackView 1.0 TransactionStackView.qml
|
TransactionStackView 1.0 TransactionStackView.qml
|
||||||
|
PasswordView 1.0 PasswordView.qml
|
||||||
|
|
52
ui/main.qml
52
ui/main.qml
|
@ -20,7 +20,6 @@ import AppLayouts.Onboarding 1.0
|
||||||
|
|
||||||
StatusWindow {
|
StatusWindow {
|
||||||
property bool hasAccounts: startupModule.appState !== Constants.appState.onboarding
|
property bool hasAccounts: startupModule.appState !== Constants.appState.onboarding
|
||||||
property bool displayBeforeGetStartedModal: !hasAccounts
|
|
||||||
property bool appIsReady: false
|
property bool appIsReady: false
|
||||||
|
|
||||||
Universal.theme: Universal.System
|
Universal.theme: Universal.System
|
||||||
|
@ -109,9 +108,6 @@ StatusWindow {
|
||||||
// We set main module to the Global singleton once user is logged in and we move to the main app.
|
// We set main module to the Global singleton once user is logged in and we move to the main app.
|
||||||
Global.mainModuleInst = mainModule
|
Global.mainModuleInst = mainModule
|
||||||
|
|
||||||
mainModule.openStoreToKeychainPopup.connect(function(){
|
|
||||||
storeToKeychainConfirmationPopup.open()
|
|
||||||
})
|
|
||||||
if(localAccountSensitiveSettings.recentEmojis === "") {
|
if(localAccountSensitiveSettings.recentEmojis === "") {
|
||||||
localAccountSensitiveSettings.recentEmojis = [];
|
localAccountSensitiveSettings.recentEmojis = [];
|
||||||
}
|
}
|
||||||
|
@ -253,50 +249,6 @@ StatusWindow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepareForStoring(password, runStoreToKeychainPopup) {
|
|
||||||
if(Qt.platform.os == "osx")
|
|
||||||
{
|
|
||||||
storeToKeychainConfirmationPopup.password = password
|
|
||||||
|
|
||||||
if(runStoreToKeychainPopup)
|
|
||||||
storeToKeychainConfirmationPopup.open()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ConfirmationDialog {
|
|
||||||
id: storeToKeychainConfirmationPopup
|
|
||||||
property string password: ""
|
|
||||||
height: 200
|
|
||||||
confirmationText: qsTr("Would you like to store password to the Keychain?")
|
|
||||||
showRejectButton: true
|
|
||||||
showCancelButton: true
|
|
||||||
confirmButtonLabel: qsTr("Store")
|
|
||||||
rejectButtonLabel: qsTr("Not now")
|
|
||||||
cancelButtonLabel: qsTr("Never")
|
|
||||||
|
|
||||||
function finish()
|
|
||||||
{
|
|
||||||
password = ""
|
|
||||||
storeToKeychainConfirmationPopup.close()
|
|
||||||
}
|
|
||||||
|
|
||||||
onConfirmButtonClicked: {
|
|
||||||
localAccountSettings.storeToKeychainValue = Constants.storeToKeychainValueStore
|
|
||||||
mainModule.storePassword(password)
|
|
||||||
finish()
|
|
||||||
}
|
|
||||||
|
|
||||||
onRejectButtonClicked: {
|
|
||||||
localAccountSettings.storeToKeychainValue = Constants.storeToKeychainValueNotNow
|
|
||||||
finish()
|
|
||||||
}
|
|
||||||
|
|
||||||
onCancelButtonClicked: {
|
|
||||||
localAccountSettings.storeToKeychainValue = Constants.storeToKeychainValueNever
|
|
||||||
finish()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Loader {
|
Loader {
|
||||||
id: loader
|
id: loader
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
|
@ -321,7 +273,9 @@ StatusWindow {
|
||||||
|
|
||||||
onOnBoardingStepChanged: {
|
onOnBoardingStepChanged: {
|
||||||
loader.sourceComponent = view;
|
loader.sourceComponent = view;
|
||||||
loader.item.state = state;
|
if (!!state) {
|
||||||
|
loader.item.state = state;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue