291 lines
10 KiB
QML
291 lines
10 KiB
QML
import QtQuick 2.12
|
|
import QtQuick.Controls 2.3
|
|
import QtQuick.Layouts 1.3
|
|
|
|
import utils 1.0
|
|
import "../../../../shared"
|
|
import "../../../../shared/popups"
|
|
import "../../../../shared/controls"
|
|
import "../../../../shared/status"
|
|
|
|
// TODO: replace with StatusModal
|
|
ModalPopup {
|
|
id: popup
|
|
|
|
property bool showWarning: true
|
|
property int seedWord1Idx: -1;
|
|
property int seedWord2Idx: -1;
|
|
property string validationError: ""
|
|
|
|
focus: visible
|
|
|
|
onOpened: {
|
|
seedWord1Idx = -1;
|
|
seedWord2Idx = -1;
|
|
txtFieldWord.text = "";
|
|
validationError = "";
|
|
}
|
|
|
|
header: Item {
|
|
height: 50
|
|
StyledText {
|
|
id: lblTitle
|
|
//% "Back up seed phrase"
|
|
text: qsTrId("back-up-seed-phrase")
|
|
font.pixelSize: 17
|
|
font.bold: true
|
|
anchors.left: parent.left
|
|
}
|
|
StyledText {
|
|
anchors.top: lblTitle.bottom
|
|
anchors.topMargin: Style.current.smallPadding
|
|
//% "Step %1 of 3"
|
|
text: qsTrId("step--1-of-3").arg(seedWord2Idx > -1 ? 3 : (seedWord1Idx > -1 ? 2 : 1))
|
|
font.pixelSize: 14
|
|
anchors.left: parent.left
|
|
}
|
|
}
|
|
|
|
Loader {
|
|
active: popup.opened && !showWarning && seedWord1Idx == -1
|
|
width: parent.width
|
|
height: item ? item.height : 0
|
|
|
|
sourceComponent: Component {
|
|
id: seedComponent
|
|
Item {
|
|
id: seed
|
|
width: parent.width
|
|
height: children[0].height
|
|
|
|
Rectangle {
|
|
id: wrapper
|
|
property int len: mnemonicRepeater.count
|
|
anchors.top: parent.top
|
|
anchors.topMargin: Style.current.padding
|
|
height: 40 * (len / 2)
|
|
width: 350
|
|
border.width: 1
|
|
color: Style.current.background
|
|
border.color: Style.current.border
|
|
radius: Style.current.radius
|
|
anchors.horizontalCenter: parent.horizontalCenter
|
|
|
|
Repeater {
|
|
id: mnemonicRepeater
|
|
model: profileModel.mnemonic.get.split(" ")
|
|
Rectangle {
|
|
id: word
|
|
height: 40
|
|
width: 175
|
|
color: "transparent"
|
|
anchors.top: (index == 0
|
|
|| index == (wrapper.len / 2)) ? parent.top : parent.children[index - 1].bottom
|
|
anchors.left: (index < (wrapper.len / 2)) ? parent.left : undefined
|
|
anchors.right: (index >= wrapper.len / 2) ? parent.right : undefined
|
|
|
|
Rectangle {
|
|
width: 1
|
|
height: parent.height
|
|
anchors.top: parent.top
|
|
anchors.bottom: parent.bottom
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: 175
|
|
color: Style.current.inputBackground
|
|
visible: index >= wrapper.len / 2
|
|
}
|
|
|
|
StyledText {
|
|
id: count
|
|
text: index + 1
|
|
color: Style.current.secondaryText
|
|
anchors.bottom: parent.bottom
|
|
anchors.bottomMargin: Style.current.smallPadding
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: Style.current.bigPadding
|
|
font.pixelSize: 15
|
|
}
|
|
|
|
StyledTextEdit {
|
|
text: modelData
|
|
font.pixelSize: 15
|
|
anchors.bottom: parent.bottom
|
|
anchors.bottomMargin: Style.current.smallPadding
|
|
anchors.left: count.right
|
|
anchors.leftMargin: Style.current.padding
|
|
selectByMouse: true
|
|
readOnly: true
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Item {
|
|
visible: showWarning
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
StyledText {
|
|
id: lblLoseSeed
|
|
//% "If you lose your seed phrase you lose your data and funds"
|
|
text: qsTrId("your-data-belongs-to-you")
|
|
wrapMode: Text.WordWrap
|
|
font.pixelSize: 17
|
|
font.bold: true
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
}
|
|
StyledText {
|
|
anchors.top: lblLoseSeed.bottom
|
|
anchors.topMargin: Style.current.smallPadding
|
|
wrapMode: Text.WordWrap
|
|
//% "If you lose access, for example by losing your phone, you can only access your keys with your seed phrase. No one, but you has your seed phrase. Write it down. Keep it safe"
|
|
text: qsTrId("your-data-belongs-to-you-description")
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
}
|
|
}
|
|
|
|
Item {
|
|
id: textInput
|
|
visible: seedWord1Idx > -1 || seedWord2Idx > -1
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
focus: visible
|
|
onActiveFocusChanged: {
|
|
if (activeFocus)
|
|
txtFieldWord.forceActiveFocus(Qt.MouseFocusReason)
|
|
}
|
|
Keys.onReturnPressed: function(event) {
|
|
confirmButton.clicked()
|
|
}
|
|
|
|
StyledText {
|
|
id: txtChk
|
|
//% "Check your seed phrase"
|
|
text: qsTrId("check-your-recovery-phrase")
|
|
}
|
|
StyledText {
|
|
//% "Word #%1"
|
|
text: qsTrId("word---1").arg((seedWord2Idx > -1 ? seedWord2Idx : seedWord1Idx) + 1)
|
|
anchors.left: txtChk.right
|
|
anchors.leftMargin: 5
|
|
color: Style.current.secondaryText
|
|
}
|
|
|
|
Input {
|
|
id: txtFieldWord
|
|
anchors.top: txtChk.bottom
|
|
anchors.topMargin: Style.current.padding
|
|
anchors.left: txtChk.left
|
|
anchors.right: parent.right
|
|
//% "Enter word"
|
|
placeholderText: qsTrId("enter-word")
|
|
text: ""
|
|
validationError: popup.validationError
|
|
}
|
|
|
|
StyledText {
|
|
anchors.top: txtFieldWord.bottom
|
|
anchors.topMargin: Style.current.padding
|
|
wrapMode: Text.WordWrap
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
//% "In order to check if you have backed up your seed phrase correctly, enter the word #%1 above"
|
|
text: qsTrId("in-order-to-check-if-you-have-backed-up-your-seed-phrase-correctly--enter-the-word---1-above").arg((seedWord2Idx > -1 ? seedWord2Idx : seedWord1Idx) + 1)
|
|
color: Style.current.secondaryText
|
|
}
|
|
|
|
Component {
|
|
id: removeSeedPhraseConfirmDialogComponent
|
|
ConfirmationDialog {
|
|
id: confirmPopup
|
|
//% "Are you sure?"
|
|
header.title: qsTrId("are-you-sure?")
|
|
//% "You will not be able to see the whole seed phrase again"
|
|
confirmationText: qsTrId("are-you-sure-description")
|
|
onConfirmButtonClicked: {
|
|
profileModel.mnemonic.remove()
|
|
popup.close();
|
|
confirmPopup.close();
|
|
}
|
|
onClosed: {
|
|
destroy();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
StyledText {
|
|
id: confirmationsInfo
|
|
visible: !showWarning && seedWord1Idx == -1
|
|
//% "With this 12 words you can always get your key back. Write it down. Keep it safe, offline, and separate from this device."
|
|
text: qsTrId(
|
|
"with-this-12-words-you-can-always-get-your-key-back.-write-it-down.-keep-it-safe,-offline,-and-separate-from-this-device.")
|
|
font.pixelSize: 14
|
|
font.weight: Font.Medium
|
|
color: Style.current.secondaryText
|
|
anchors.bottom: parent.bottom
|
|
anchors.bottomMargin: Style.current.padding
|
|
anchors.left: parent.left
|
|
anchors.leftMargin: Style.current.smallPadding
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: Style.current.smallPadding
|
|
wrapMode: Text.WordWrap
|
|
}
|
|
|
|
|
|
|
|
footer: StatusButton {
|
|
id: confirmButton
|
|
text: showWarning ?
|
|
//% "Okay, continue"
|
|
qsTrId("ok-continue") :
|
|
//% "Next"
|
|
qsTrId("next")
|
|
anchors.right: parent.right
|
|
anchors.rightMargin: Style.current.smallPadding
|
|
anchors.bottom: parent.bottom
|
|
focus: !textInput.visible
|
|
Keys.onReturnPressed: function(event) {
|
|
confirmButton.clicked()
|
|
}
|
|
onClicked: {
|
|
if(showWarning){
|
|
showWarning = false;
|
|
} else {
|
|
if(seedWord1Idx == -1){
|
|
seedWord1Idx = Math.floor(Math.random() * 12);
|
|
} else {
|
|
if(seedWord2Idx == -1){
|
|
if(profileModel.mnemonic.getWord(seedWord1Idx) !== txtFieldWord.text){
|
|
//% "Wrong word"
|
|
validationError = qsTrId("wrong-word");
|
|
return;
|
|
}
|
|
|
|
validationError = "";
|
|
txtFieldWord.text = "";
|
|
|
|
do {
|
|
seedWord2Idx = Math.floor(Math.random() * 12);
|
|
} while(seedWord2Idx == seedWord1Idx);
|
|
} else {
|
|
if(profileModel.mnemonic.getWord(seedWord2Idx) !== txtFieldWord.text){
|
|
//% "Wrong word"
|
|
validationError = qsTrId("wrong-word");
|
|
return;
|
|
}
|
|
|
|
validationError = "";
|
|
txtFieldWord.text = "";
|
|
openPopup(removeSeedPhraseConfirmDialogComponent);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|