181 lines
5.8 KiB
QML
181 lines
5.8 KiB
QML
import QtQuick 2.15
|
||
import QtQuick.Layouts 1.15
|
||
|
||
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
|
||
anchors.topMargin: Theme.xlPadding
|
||
anchors.bottomMargin: Theme.halfPadding
|
||
anchors.leftMargin: Theme.xlPadding
|
||
anchors.rightMargin: Theme.xlPadding
|
||
spacing: Theme.padding
|
||
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 {
|
||
validate: function (t) {
|
||
if (!d.seedPhrase || d.seedPhrase.length === 0 || word0.text.length === 0)
|
||
return false
|
||
return (d.seedPhrase[d.wordNumbers[0]] === word0.text)
|
||
}
|
||
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 {
|
||
validate: function (t) {
|
||
if (!d.seedPhrase || d.seedPhrase.length === 0 || word1.text.length === 0)
|
||
return false
|
||
return (d.seedPhrase[d.wordNumbers[1]] === word1.text)
|
||
}
|
||
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 {
|
||
validate: function (t) {
|
||
if (!d.seedPhrase || d.seedPhrase.length === 0 || word2.text.length === 0)
|
||
return false
|
||
return (d.seedPhrase[d.wordNumbers[2]] === word2.text)
|
||
}
|
||
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
|
||
}
|
||
}
|
||
}
|