315 lines
9.5 KiB
QML
315 lines
9.5 KiB
QML
import QtQuick 2.13
|
|
import QtQuick.Layouts 1.12
|
|
import QtQuick.Controls 2.14
|
|
import QtQuick.Dialogs 1.3
|
|
|
|
import StatusQ.Components 0.1
|
|
import StatusQ.Controls 0.1
|
|
import StatusQ.Core 0.1
|
|
import StatusQ.Core.Theme 0.1
|
|
import StatusQ.Popups 0.1
|
|
|
|
|
|
import shared.panels 1.0
|
|
import shared 1.0
|
|
import shared.popups 1.0
|
|
|
|
import utils 1.0
|
|
import shared.controls 1.0
|
|
import "../popups"
|
|
import "../stores"
|
|
import "../shared"
|
|
|
|
Item {
|
|
id: root
|
|
|
|
property string pubKey
|
|
property string address
|
|
property string displayName
|
|
signal createPassword()
|
|
|
|
state: "username"
|
|
|
|
Component.onCompleted: {
|
|
if (!!OnboardingStore.onboardingModuleInst.importedAccountPubKey) {
|
|
root.address = OnboardingStore.onboardingModuleInst.importedAccountAddress ;
|
|
root.pubKey = OnboardingStore.onboardingModuleInst.importedAccountPubKey;
|
|
}
|
|
nameInput.input.edit.forceActiveFocus();
|
|
}
|
|
|
|
Loader {
|
|
active: !OnboardingStore.onboardingModuleInst.importedAccountPubKey
|
|
sourceComponent: ListView {
|
|
model: OnboardingStore.onboardingModuleInst.accountsModel
|
|
delegate: Item {
|
|
Component.onCompleted: {
|
|
if (index === 0) {
|
|
root.address = model.address;
|
|
root.pubKey = model.pubKey;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
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
|
|
height: 80
|
|
isIdenticon: false
|
|
}
|
|
|
|
icon {
|
|
width: 80
|
|
height: 80
|
|
letterSize: 32
|
|
color: Theme.palette.miscColor5
|
|
charactersLen: 2
|
|
}
|
|
|
|
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: {
|
|
cropperModal.chooseImageToCrop()
|
|
}
|
|
}
|
|
}
|
|
|
|
StatusInput {
|
|
id: nameInput
|
|
implicitWidth: 328
|
|
Layout.preferredHeight: 78
|
|
Layout.alignment: Qt.AlignHCenter
|
|
input.placeholderText: qsTr("Display name")
|
|
input.rightComponent: RoundedIcon {
|
|
width: 14
|
|
height: 14
|
|
iconWidth: 14
|
|
iconHeight: 14
|
|
visible: (nameInput.input.text.length > 0)
|
|
color: "transparent"
|
|
source: Style.svg("close-filled")
|
|
onClicked: {
|
|
nameInput.input.edit.clear();
|
|
}
|
|
}
|
|
errorMessageCmp.wrapMode: Text.NoWrap
|
|
errorMessageCmp.horizontalAlignment: Text.AlignHCenter
|
|
validators: Constants.validators.displayName
|
|
onTextChanged: {
|
|
userImage.name = text;
|
|
}
|
|
input.acceptReturn: true
|
|
onKeyPressed: {
|
|
if (input.edit.keyEvent === Qt.Key_Return || input.edit.keyEvent === Qt.Key_Enter) {
|
|
event.accepted = true
|
|
nextBtn.clicked(null)
|
|
}
|
|
}
|
|
}
|
|
|
|
StyledText {
|
|
id: chatKeyTxt
|
|
color: Style.current.secondaryText
|
|
text: qsTr("Chatkey:") + " " + Utils.getCompressedPk(root.pubKey)
|
|
horizontalAlignment: Text.AlignHCenter
|
|
wrapMode: Text.WordWrap
|
|
Layout.alignment: Qt.AlignHCenter
|
|
font.pixelSize: 15
|
|
}
|
|
|
|
Item {
|
|
id: chainsChatKeyImg
|
|
Layout.alignment: Qt.AlignHCenter
|
|
Layout.preferredWidth: 400
|
|
Layout.preferredHeight: 84
|
|
Image {
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
source: Style.png("onboarding/chains")
|
|
}
|
|
EmojiHash {
|
|
anchors {
|
|
bottom: parent.bottom
|
|
left: parent.left
|
|
leftMargin: 80
|
|
}
|
|
|
|
publicKey: root.pubKey
|
|
}
|
|
StatusSmartIdenticon {
|
|
id: userImageCopy
|
|
|
|
anchors {
|
|
bottom: parent.bottom
|
|
right: parent.right
|
|
rightMargin: 116
|
|
}
|
|
|
|
icon.width: 44
|
|
icon.height: 44
|
|
icon.color: "transparent"
|
|
ringSettings { ringSpecModel: Utils.getColorHashAsJson(root.pubKey) }
|
|
}
|
|
}
|
|
StatusButton {
|
|
id: nextBtn
|
|
Layout.alignment: Qt.AlignHCenter | Qt.AlignTop
|
|
Layout.topMargin: 125
|
|
enabled: !!nameInput.text && nameInput.valid
|
|
text: qsTr("Next")
|
|
onClicked: {
|
|
if (root.state === "username") {
|
|
if (OnboardingStore.accountCreated) {
|
|
OnboardingStore.updatedDisplayName(nameInput.text);
|
|
}
|
|
OnboardingStore.displayName = nameInput.text
|
|
root.displayName = nameInput.text;
|
|
root.state = "chatkey";
|
|
} else {
|
|
createPassword();
|
|
}
|
|
}
|
|
}
|
|
|
|
ImageCropWorkflow {
|
|
id: cropperModal
|
|
|
|
imageFileDialogTitle: qsTr("Choose an image for profile picture")
|
|
title: qsTr("Profile picture")
|
|
acceptButtonText: qsTr("Make this my profile picture")
|
|
|
|
onImageCropped: {
|
|
const croppedImg = OnboardingStore.generateImage(image,
|
|
cropRect.x.toFixed(),
|
|
cropRect.y.toFixed(),
|
|
(cropRect.x + cropRect.width).toFixed(),
|
|
(cropRect.y + cropRect.height).toFixed())
|
|
userImage.image.source = croppedImg
|
|
}
|
|
}
|
|
}
|
|
|
|
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
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|