status-desktop/ui/app/AppLayouts/Onboarding2/KeycardCreateProfileFlow.qml
Michał Cieślak d1ac45ce6c Onboarding: KeycardCreatePinPage and SeedphrasePage refactored to be pure UI components
Now those components are not aware of any logic in the upper layer,
making the flows more structured and easier to follow.

Required for: #17232
2025-02-12 13:54:46 +01:00

197 lines
5.2 KiB
QML

import QtQuick 2.15
import QtQuick.Controls 2.15
import StatusQ.Core.Utils 0.1 as SQUtils
import StatusQ.Core.Backpressure 0.1
import AppLayouts.Onboarding2.pages 1.0
import AppLayouts.Onboarding.enums 1.0
import utils 1.0
SQUtils.QObject {
id: root
required property StackView stackView
required property int keycardState
required property int pinSettingState
required property int authorizationState
required property int addKeyPairState
required property int keycardPinInfoPageDelay
required property var generateMnemonic
required property var isSeedPhraseValid
property bool displayKeycardPromoBanner
signal loginWithKeycardRequested
signal keycardFactoryResetRequested
signal loadMnemonicRequested
signal setPinRequested(string pin)
signal seedphraseSubmitted(string seedphrase)
signal authorizationRequested
signal finished(bool withNewSeedphrase)
function init() {
root.stackView.push(d.initialComponent())
}
QtObject {
id: d
property bool withNewSeedphrase
property var mnemonic
function initialComponent() {
if (root.keycardState === Onboarding.KeycardState.Empty)
return createKeycardProfilePage
if (root.keycardState === Onboarding.KeycardState.NotEmpty)
return keycardNotEmptyPage
return keycardIntroPage
}
}
Component {
id: keycardIntroPage
KeycardIntroPage {
keycardState: root.keycardState
displayPromoBanner: root.displayKeycardPromoBanner
factoryResetAvailable: true
onKeycardFactoryResetRequested: root.keycardFactoryResetRequested()
onEmptyKeycardDetected: root.stackView.replace(createKeycardProfilePage)
onNotEmptyKeycardDetected: root.stackView.replace(keycardNotEmptyPage)
}
}
Component {
id: createKeycardProfilePage
CreateKeycardProfilePage {
onCreateKeycardProfileWithNewSeedphrase: {
d.withNewSeedphrase = true
root.stackView.push(keycardCreatePinPage)
}
onCreateKeycardProfileWithExistingSeedphrase: {
d.withNewSeedphrase = false
root.stackView.push(seedphrasePage)
}
}
}
Component {
id: keycardNotEmptyPage
KeycardNotEmptyPage {
onLoginWithThisKeycardRequested: root.loginWithKeycardRequested()
onKeycardFactoryResetRequested: root.keycardFactoryResetRequested()
}
}
Component {
id: backupSeedIntroPage
BackupSeedphraseIntro {
onBackupSeedphraseRequested: root.stackView.push(backupSeedAcksPage)
}
}
Component {
id: backupSeedAcksPage
BackupSeedphraseAcks {
onBackupSeedphraseContinue: root.stackView.push(backupSeedRevealPage)
}
}
Component {
id: backupSeedRevealPage
BackupSeedphraseReveal {
Component.onCompleted: {
try {
d.mnemonic = root.generateMnemonic()
root.seedphraseSubmitted(d.mnemonic)
} catch (e) {
console.error('failed to generate mnemonic', e)
}
}
mnemonic: d.mnemonic
onBackupSeedphraseConfirmed: root.stackView.push(backupSeedVerifyPage)
}
}
Component {
id: backupSeedVerifyPage
BackupSeedphraseVerify {
mnemonic: d.mnemonic
countToVerify: 4
onBackupSeedphraseVerified: root.stackView.push(backupSeedOutroPage)
}
}
Component {
id: backupSeedOutroPage
BackupSeedphraseOutro {
onBackupSeedphraseRemovalConfirmed: {
root.loadMnemonicRequested()
root.stackView.push(addKeypairPage)
}
}
}
Component {
id: seedphrasePage
SeedphrasePage {
title: qsTr("Create profile on empty Keycard using a recovery phrase")
isSeedPhraseValid: root.isSeedPhraseValid
onSeedphraseSubmitted: (seedphrase) => {
root.seedphraseSubmitted(seedphrase)
root.stackView.push(keycardCreatePinPage)
}
}
}
Component {
id: keycardCreatePinPage
KeycardCreatePinDelayedPage {
pinSettingState: root.pinSettingState
authorizationState: root.authorizationState
onSetPinRequested: (pin) => root.setPinRequested(pin)
onAuthorizationRequested: root.authorizationRequested()
onFinished: {
if (d.withNewSeedphrase) {
root.stackView.push(backupSeedIntroPage)
} else {
root.loadMnemonicRequested()
root.stackView.push(addKeypairPage)
}
}
}
}
Component {
id: addKeypairPage
KeycardAddKeyPairDelayedPage {
readonly property bool backAvailableHint: false
addKeyPairState: root.addKeyPairState
onFinished: root.finished(d.withNewSeedphrase)
}
}
}