2024-10-15 19:26:12 +00:00
|
|
|
|
import QtQuick 2.15
|
|
|
|
|
import QtQuick.Layouts 1.15
|
2022-08-31 17:09:07 +00:00
|
|
|
|
|
|
|
|
|
import StatusQ.Core 0.1
|
|
|
|
|
import StatusQ.Core.Theme 0.1
|
|
|
|
|
import StatusQ.Controls 0.1
|
|
|
|
|
import StatusQ.Controls.Validators 0.1
|
|
|
|
|
|
|
|
|
|
import utils 1.0
|
|
|
|
|
|
|
|
|
|
Item {
|
|
|
|
|
id: root
|
|
|
|
|
|
|
|
|
|
property var sharedKeycardModule
|
|
|
|
|
|
|
|
|
|
signal validation(bool result)
|
|
|
|
|
|
|
|
|
|
QtObject {
|
|
|
|
|
id: d
|
|
|
|
|
|
|
|
|
|
property bool allEntriesValid: false
|
|
|
|
|
readonly property var seedPhrase: root.sharedKeycardModule.getMnemonic().split(" ")
|
|
|
|
|
readonly property var wordNumbers: {
|
|
|
|
|
let numbers = []
|
|
|
|
|
while (numbers.length < 3) {
|
|
|
|
|
let randomNo = Math.floor(Math.random() * 12)
|
|
|
|
|
if(numbers.indexOf(randomNo) == -1)
|
|
|
|
|
numbers.push(randomNo)
|
|
|
|
|
}
|
|
|
|
|
numbers.sort((a, b) => { return a < b? -1 : a > b? 1 : 0 })
|
|
|
|
|
return numbers
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function processText(text) {
|
|
|
|
|
if(text.length === 0)
|
|
|
|
|
return ""
|
|
|
|
|
if(/(^\s|^\r|^\n)|(\s$|^\r$|^\n$)/.test(text)) {
|
|
|
|
|
return text.trim()
|
|
|
|
|
}
|
|
|
|
|
else if(/\s|\r|\n/.test(text)) {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
return text
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function updateValidity() {
|
|
|
|
|
d.allEntriesValid = word0.valid && word1.valid && word2.valid
|
|
|
|
|
root.validation(d.allEntriesValid)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ColumnLayout {
|
|
|
|
|
anchors.fill: parent
|
2024-10-15 19:26:12 +00:00
|
|
|
|
anchors.topMargin: Theme.xlPadding
|
|
|
|
|
anchors.bottomMargin: Theme.halfPadding
|
|
|
|
|
anchors.leftMargin: Theme.xlPadding
|
|
|
|
|
anchors.rightMargin: Theme.xlPadding
|
|
|
|
|
spacing: Theme.padding
|
2022-08-31 17:09:07 +00:00
|
|
|
|
clip: true
|
|
|
|
|
|
|
|
|
|
StatusBaseText {
|
|
|
|
|
id: title
|
|
|
|
|
Layout.preferredHeight: Constants.keycard.general.titleHeight
|
|
|
|
|
Layout.alignment: Qt.AlignHCenter
|
|
|
|
|
text: qsTr("Confirm seed phrase words")
|
|
|
|
|
font.pixelSize: Constants.keycard.general.fontSize1
|
|
|
|
|
font.weight: Font.Bold
|
|
|
|
|
color: Theme.palette.directColor1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StatusInput {
|
|
|
|
|
id: word0
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
validationMode: StatusInput.ValidationMode.Always
|
|
|
|
|
label: qsTr("Word #%1").arg(d.wordNumbers[0] + 1)
|
|
|
|
|
placeholderText: qsTr("Enter word")
|
|
|
|
|
validators: [
|
|
|
|
|
StatusValidator {
|
2022-12-16 09:37:08 +00:00
|
|
|
|
validate: function (t) {
|
|
|
|
|
if (!d.seedPhrase || d.seedPhrase.length === 0 || word0.text.length === 0)
|
|
|
|
|
return false
|
|
|
|
|
return (d.seedPhrase[d.wordNumbers[0]] === word0.text)
|
|
|
|
|
}
|
2022-08-31 17:09:07 +00:00
|
|
|
|
errorMessage: (word0.text.length) > 0 ? qsTr("This word doesn’t match") : ""
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
input.acceptReturn: true
|
|
|
|
|
input.tabNavItem: word1.input.edit
|
|
|
|
|
|
|
|
|
|
onTextChanged: {
|
|
|
|
|
text = d.processText(text)
|
|
|
|
|
d.updateValidity()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onKeyPressed: {
|
|
|
|
|
if (d.allEntriesValid &&
|
|
|
|
|
(input.edit.keyEvent === Qt.Key_Return ||
|
|
|
|
|
input.edit.keyEvent === Qt.Key_Enter)) {
|
|
|
|
|
event.accepted = true
|
|
|
|
|
root.sharedKeycardModule.currentState.doPrimaryAction()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StatusInput {
|
|
|
|
|
id: word1
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
validationMode: StatusInput.ValidationMode.Always
|
|
|
|
|
label: qsTr("Word #%1").arg(d.wordNumbers[1] + 1)
|
|
|
|
|
placeholderText: qsTr("Enter word")
|
|
|
|
|
validators: [
|
|
|
|
|
StatusValidator {
|
2022-12-16 09:37:08 +00:00
|
|
|
|
validate: function (t) {
|
|
|
|
|
if (!d.seedPhrase || d.seedPhrase.length === 0 || word1.text.length === 0)
|
|
|
|
|
return false
|
|
|
|
|
return (d.seedPhrase[d.wordNumbers[1]] === word1.text)
|
|
|
|
|
}
|
2022-08-31 17:09:07 +00:00
|
|
|
|
errorMessage: (word1.text.length) > 0 ? qsTr("This word doesn’t match") : ""
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
input.acceptReturn: true
|
|
|
|
|
input.tabNavItem: word2.input.edit
|
|
|
|
|
|
|
|
|
|
onTextChanged: {
|
|
|
|
|
text = d.processText(text)
|
|
|
|
|
d.updateValidity()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onKeyPressed: {
|
|
|
|
|
if (d.allEntriesValid &&
|
|
|
|
|
(input.edit.keyEvent === Qt.Key_Return ||
|
|
|
|
|
input.edit.keyEvent === Qt.Key_Enter)) {
|
|
|
|
|
event.accepted = true
|
|
|
|
|
root.sharedKeycardModule.currentState.doPrimaryAction()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StatusInput {
|
|
|
|
|
id: word2
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
validationMode: StatusInput.ValidationMode.Always
|
|
|
|
|
label: qsTr("Word #%1").arg(d.wordNumbers[2] + 1)
|
|
|
|
|
placeholderText: qsTr("Enter word")
|
|
|
|
|
validators: [
|
|
|
|
|
StatusValidator {
|
2022-12-16 09:37:08 +00:00
|
|
|
|
validate: function (t) {
|
|
|
|
|
if (!d.seedPhrase || d.seedPhrase.length === 0 || word2.text.length === 0)
|
|
|
|
|
return false
|
|
|
|
|
return (d.seedPhrase[d.wordNumbers[2]] === word2.text)
|
|
|
|
|
}
|
2022-08-31 17:09:07 +00:00
|
|
|
|
errorMessage: (word2.text.length) > 0 ? qsTr("This word doesn’t match") : ""
|
|
|
|
|
}
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
input.acceptReturn: true
|
|
|
|
|
|
|
|
|
|
onTextChanged: {
|
|
|
|
|
text = d.processText(text)
|
|
|
|
|
d.updateValidity()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onKeyPressed: {
|
|
|
|
|
if (d.allEntriesValid &&
|
|
|
|
|
(input.edit.keyEvent === Qt.Key_Return ||
|
|
|
|
|
input.edit.keyEvent === Qt.Key_Enter)) {
|
|
|
|
|
event.accepted = true
|
|
|
|
|
root.sharedKeycardModule.currentState.doPrimaryAction()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Item {
|
|
|
|
|
Layout.fillWidth: true
|
|
|
|
|
Layout.fillHeight: true
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|