status-desktop/ui/app/AppLayouts/Onboarding2/pages/BackupSeedphraseVerify.qml
Lukáš Tinkl 3705249e40 feat(Onboarding): Create Profile & Login flows
- implement the basic Onboarding UI skeleton and the Create Profile
flows
- adjust the PasswordView and EnterSeedPhrase views to the latest design
- add the main OnboardingLayout and StatusPinInput pages to Storybook
- change terminology app-wide: "Seed phrase" -> "Recovery phrase"
- implement the Login flows (seed, sync, keycard)
- amend the keycard flow sequences with separate (non) empty page

Fixes #16719
Fixes #16742
Fixes #16743
2025-01-14 10:49:42 +01:00

118 lines
4.1 KiB
QML

import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import StatusQ.Core 0.1
import StatusQ.Core.Utils 0.1 as SQUtils
import StatusQ.Components 0.1
import StatusQ.Controls 0.1
import StatusQ.Core.Theme 0.1
import AppLayouts.Onboarding2.components 1.0
import shared.stores 1.0
import SortFilterProxyModel 0.2
OnboardingPage {
id: root
required property var seedWordsToVerify // [{seedWordNumber:int, seedWord:string}, ...]
signal backupSeedphraseVerified()
pageClassName: "BackupSeedphraseVerify"
QtObject {
id: d
readonly property var seedSuggestions: BIP39_en {} // [{seedWord:string}, ...]
}
contentItem: Item {
ColumnLayout {
anchors.centerIn: parent
width: Math.min(440, root.availableWidth)
spacing: Theme.xlPadding
StatusBaseText {
Layout.fillWidth: true
text: qsTr("Backup your recovery phrase")
font.pixelSize: 22
font.bold: true
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
}
StepIndicator {
Layout.fillWidth: true
spacing: Theme.halfPadding
currentStep: 2
totalSteps: 3
caption: qsTr("Confirm the following words from your recovery phrase...")
}
ColumnLayout {
Layout.fillWidth: true
spacing: Theme.halfPadding
Repeater {
readonly property bool allValid: {
for (let i = 0; i < count; i++) {
if (!!itemAt(i) && !itemAt(i).valid)
return false
}
return true
}
id: seedRepeater
model: root.seedWordsToVerify
delegate: RowLayout {
id: seedWordDelegate
required property var modelData
required property int index
readonly property bool valid: seedInput.valid
readonly property alias input: seedInput
Layout.fillWidth: true
Layout.topMargin: Theme.halfPadding
Layout.bottomMargin: Theme.halfPadding
spacing: 12
StatusBaseText {
Layout.preferredWidth: 20
text: modelData.seedWordNumber
}
SeedphraseVerifyInput {
readonly property int seedWordIndex: modelData.seedWordNumber - 1 // 0 based idx into the seedWords
objectName: "seedInput_%1".arg(index)
Layout.fillWidth: true
id: seedInput
valid: text === modelData.seedWord
seedSuggestions: d.seedSuggestions
Component.onCompleted: if (index === 0) forceActiveFocus()
onAccepted: {
if (seedRepeater.allValid) { // move to next page
root.backupSeedphraseVerified()
} else { // move to next field
const nextItem = seedRepeater.itemAt(index + 1) ?? seedRepeater.itemAt(0)
if (!!nextItem) {
nextItem.input.forceActiveFocus()
}
}
}
}
}
}
}
StatusButton {
objectName: "btnContinue"
Layout.alignment: Qt.AlignHCenter
text: qsTr("Continue")
enabled: seedRepeater.allValid
onClicked: root.backupSeedphraseVerified()
}
}
}
}