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 } } }