import QtQuick 2.14 import StatusQ.Controls 0.1 import StatusQ.Core.Theme 0.1 import utils 1.0 QtObject { id: root property var sharedKeycardModule property bool primaryButtonEnabled: false readonly property bool disablePopupClose: { switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.recognizedKeycard: case Constants.keycardSharedState.renamingKeycard: case Constants.keycardSharedState.changingKeycardPin: case Constants.keycardSharedState.changingKeycardPuk: case Constants.keycardSharedState.changingKeycardPairingCode: case Constants.keycardSharedState.migratingKeyPair: case Constants.keycardSharedState.creatingAccountNewSeedPhrase: case Constants.keycardSharedState.creatingAccountOldSeedPhrase: case Constants.keycardSharedState.copyingKeycard: return true case Constants.keycardSharedState.keyPairMigrateSuccess: return root.sharedKeycardModule.migratingProfileKeyPair() } return false } property list leftButtons: [ StatusBackButton { id: backButton visible: root.sharedKeycardModule.currentState.displayBackButton height: Constants.keycard.general.footerButtonsHeight width: height onClicked: { root.sharedKeycardModule.currentState.doBackAction() } } ] property list rightButtons: [ StatusButton { id: cancelButton height: Constants.keycard.general.footerButtonsHeight borderColor: Theme.palette.baseColor2 normalColor: "transparent" text: qsTr("Cancel") visible: { switch (root.sharedKeycardModule.currentState.flowType) { case Constants.keycardSharedFlow.setupNewKeycard: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.selectExistingKeyPair: case Constants.keycardSharedState.keycardNotEmpty: case Constants.keycardSharedState.keycardEmptyMetadata: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: case Constants.keycardSharedState.factoryResetConfirmation: case Constants.keycardSharedState.factoryResetConfirmationDisplayMetadata: case Constants.keycardSharedState.factoryResetSuccess: case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.keycardMetadataDisplay: return true } break case Constants.keycardSharedFlow.setupNewKeycardNewSeedPhrase: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.recognizedKeycard: case Constants.keycardSharedState.keycardNotEmpty: case Constants.keycardSharedState.keycardEmptyMetadata: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: case Constants.keycardSharedState.createPin: case Constants.keycardSharedState.repeatPin: case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: case Constants.keycardSharedState.factoryResetConfirmation: case Constants.keycardSharedState.factoryResetConfirmationDisplayMetadata: case Constants.keycardSharedState.factoryResetSuccess: case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.keycardMetadataDisplay: return true } break case Constants.keycardSharedFlow.setupNewKeycardOldSeedPhrase: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.recognizedKeycard: case Constants.keycardSharedState.keycardNotEmpty: case Constants.keycardSharedState.keycardEmptyMetadata: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: case Constants.keycardSharedState.createPin: case Constants.keycardSharedState.repeatPin: case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: case Constants.keycardSharedState.factoryResetConfirmation: case Constants.keycardSharedState.factoryResetConfirmationDisplayMetadata: case Constants.keycardSharedState.factoryResetSuccess: case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.keycardMetadataDisplay: case Constants.keycardSharedState.enterSeedPhrase: case Constants.keycardSharedState.seedPhraseAlreadyInUse: return true } break case Constants.keycardSharedFlow.factoryReset: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.recognizedKeycard: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: case Constants.keycardSharedState.keycardMetadataDisplay: case Constants.keycardSharedState.keycardEmptyMetadata: case Constants.keycardSharedState.factoryResetConfirmationDisplayMetadata: case Constants.keycardSharedState.factoryResetConfirmation: return true } break case Constants.keycardSharedFlow.authentication: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.wrongPin: case Constants.keycardSharedState.wrongKeychainPin: case Constants.keycardSharedState.biometricsReadyToSign: case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.wrongKeycard: case Constants.keycardSharedState.enterPassword: case Constants.keycardSharedState.wrongPassword: case Constants.keycardSharedState.biometricsPasswordFailed: case Constants.keycardSharedState.biometricsPinFailed: case Constants.keycardSharedState.biometricsPinInvalid: case Constants.keycardSharedState.enterBiometricsPassword: case Constants.keycardSharedState.wrongBiometricsPassword: case Constants.keycardSharedState.enterPin: return true } break case Constants.keycardSharedFlow.unlockKeycard: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.recognizedKeycard: case Constants.keycardSharedState.enterPuk: case Constants.keycardSharedState.wrongPuk: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.unlockKeycardOptions: case Constants.keycardSharedState.enterSeedPhrase: return true case Constants.keycardSharedState.maxPukRetriesReached: // we're sure that we cannot unlock it from here using seed phrase and also in this point max num of puk retries is reached // the only option to unlock a keycard is to run unlock flow from details view of the locked keycard return root.sharedKeycardModule.keycardData & Constants.predefinedKeycardData.disableSeedPhraseForUnlock } break case Constants.keycardSharedFlow.displayKeycardContent: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.recognizedKeycard: case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: return true } break case Constants.keycardSharedFlow.renameKeycard: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.recognizedKeycard: case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.keycardMetadataDisplay: case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: return true } break case Constants.keycardSharedFlow.changeKeycardPin: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.recognizedKeycard: case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: case Constants.keycardSharedState.createPin: case Constants.keycardSharedState.repeatPin: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: return true } break case Constants.keycardSharedFlow.changeKeycardPuk: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.recognizedKeycard: case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: case Constants.keycardSharedState.createPuk: case Constants.keycardSharedState.repeatPuk: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: return true } break case Constants.keycardSharedFlow.changePairingCode: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.recognizedKeycard: case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: case Constants.keycardSharedState.createPairingCode: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: return true } break case Constants.keycardSharedFlow.createCopyOfAKeycard: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.recognizedKeycard: case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.keycardMetadataDisplay: case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: case Constants.keycardSharedState.removeKeycard: case Constants.keycardSharedState.sameKeycard: case Constants.keycardSharedState.copyToKeycard: case Constants.keycardSharedState.enterSeedPhrase: case Constants.keycardSharedState.wrongSeedPhrase: case Constants.keycardSharedState.keycardNotEmpty: return true case Constants.keycardSharedState.keycardEmptyMetadata: let copyFromAKeycardPartDone = root.sharedKeycardModule.keycardData & Constants.predefinedKeycardData.copyFromAKeycardPartDone if (copyFromAKeycardPartDone) { return true } break } break } return false } enabled: { switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.migratingKeyPair: case Constants.keycardSharedState.creatingAccountNewSeedPhrase: case Constants.keycardSharedState.creatingAccountOldSeedPhrase: case Constants.keycardSharedState.renamingKeycard: case Constants.keycardSharedState.changingKeycardPin: case Constants.keycardSharedState.changingKeycardPuk: case Constants.keycardSharedState.changingKeycardPairingCode: case Constants.keycardSharedState.copyingKeycard: if (root.disablePopupClose) { return false } } return true } onClicked: { root.sharedKeycardModule.currentState.doCancelAction() } }, StatusButton { id: secondaryButton height: Constants.keycard.general.footerButtonsHeight borderColor: Theme.palette.baseColor2 normalColor: "transparent" text: { switch (root.sharedKeycardModule.currentState.flowType) { case Constants.keycardSharedFlow.authentication: if (userProfile.usingBiometricLogin) { switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.enterPassword: case Constants.keycardSharedState.wrongPassword: return qsTr("Use biometrics instead") case Constants.keycardSharedState.biometricsPasswordFailed: return qsTr("Use password instead") case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: return qsTr("Use biometrics") case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.biometricsReadyToSign: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.biometricsPinFailed: case Constants.keycardSharedState.wrongKeycard: case Constants.keycardSharedState.keycardEmpty: return qsTr("Use PIN") case Constants.keycardSharedState.biometricsPinInvalid: return qsTr("Update PIN") } } break case Constants.keycardSharedFlow.unlockKeycard: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.unlockKeycardOptions: if (root.sharedKeycardModule.keycardData & Constants.predefinedKeycardData.disableSeedPhraseForUnlock && !(root.sharedKeycardModule.keycardData & Constants.predefinedKeycardData.offerPukForUnlock)) { // In case max puk retries or free pairing slots is reached and user is running unlock flow from a flow // where we cannot determine key pair, than we should should display only "Close" button and inform him // to run unlock flow directly. return "" } return qsTr("Unlock using PUK") } break case Constants.keycardSharedFlow.setupNewKeycardNewSeedPhrase: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.manageKeycardAccounts: return qsTr("Add another account") } break case Constants.keycardSharedFlow.setupNewKeycardOldSeedPhrase: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.manageKeycardAccounts: return qsTr("Add another account") } break } return "" } visible: text !== "" enabled: { switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.migratingKeyPair: case Constants.keycardSharedState.creatingAccountNewSeedPhrase: case Constants.keycardSharedState.creatingAccountOldSeedPhrase: case Constants.keycardSharedState.renamingKeycard: case Constants.keycardSharedState.changingKeycardPin: case Constants.keycardSharedState.changingKeycardPuk: case Constants.keycardSharedState.changingKeycardPairingCode: case Constants.keycardSharedState.copyingKeycard: if (root.disablePopupClose) { return false } } switch (root.sharedKeycardModule.currentState.flowType) { case Constants.keycardSharedFlow.authentication: if (userProfile.usingBiometricLogin) { switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.wrongKeycard: case Constants.keycardSharedState.keycardEmpty: return false } } break case Constants.keycardSharedFlow.unlockKeycard: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.unlockKeycardOptions: return root.sharedKeycardModule.keycardData & Constants.predefinedKeycardData.offerPukForUnlock } break case Constants.keycardSharedFlow.setupNewKeycardNewSeedPhrase: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.manageKeycardAccounts: return root.primaryButtonEnabled } break case Constants.keycardSharedFlow.setupNewKeycardOldSeedPhrase: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.manageKeycardAccounts: return root.primaryButtonEnabled } break } return true } onClicked: { root.sharedKeycardModule.currentState.doSecondaryAction() } }, StatusButton { id: primaryButton objectName: "PrimaryButton" height: Constants.keycard.general.footerButtonsHeight text: { switch (root.sharedKeycardModule.currentState.flowType) { case Constants.keycardSharedFlow.setupNewKeycard: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.recognizedKeycard: case Constants.keycardSharedState.createPin: case Constants.keycardSharedState.repeatPin: case Constants.keycardSharedState.pinSet: return qsTr("Input seed phrase") case Constants.keycardSharedState.seedPhraseEnterWords: return qsTr("Yes, migrate key pair to this Keycard") case Constants.keycardSharedState.enterSeedPhrase: return qsTr("Yes, migrate key pair to Keycard") case Constants.keycardSharedState.wrongSeedPhrase: return qsTr("Try entering seed phrase again") case Constants.keycardSharedState.keycardNotEmpty: return qsTr("Check what is stored on this Keycard") case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: return qsTr("I don’t know the PIN") case Constants.keycardSharedState.factoryResetConfirmation: case Constants.keycardSharedState.factoryResetConfirmationDisplayMetadata: return qsTr("Factory reset this Keycard") case Constants.keycardSharedState.selectExistingKeyPair: case Constants.keycardSharedState.keycardEmptyMetadata: case Constants.keycardSharedState.factoryResetSuccess: case Constants.keycardSharedState.seedPhraseDisplay: case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.keycardMetadataDisplay: return qsTr("Next") case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: if (root.sharedKeycardModule.keycardData & Constants.predefinedKeycardData.disableSeedPhraseForUnlock) return qsTr("Unlock Keycard") return qsTr("Next") case Constants.keycardSharedState.migratingKeyPair: case Constants.keycardSharedState.keyPairMigrateFailure: return qsTr("Done") case Constants.keycardSharedState.keyPairMigrateSuccess: if (root.sharedKeycardModule.migratingProfileKeyPair()) return qsTr("Restart app & sign in using your new Keycard") return qsTr("Done") } break case Constants.keycardSharedFlow.setupNewKeycardNewSeedPhrase: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.keycardNotEmpty: return qsTr("Check what is stored on this Keycard") case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: return qsTr("I don’t know the PIN") case Constants.keycardSharedState.factoryResetConfirmation: case Constants.keycardSharedState.factoryResetConfirmationDisplayMetadata: return qsTr("Factory reset this Keycard") case Constants.keycardSharedState.keycardEmptyMetadata: case Constants.keycardSharedState.keycardMetadataDisplay: case Constants.keycardSharedState.factoryResetSuccess: case Constants.keycardSharedState.seedPhraseDisplay: case Constants.keycardSharedState.seedPhraseEnterWords: case Constants.keycardSharedState.createPin: case Constants.keycardSharedState.repeatPin: case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.pinSet: case Constants.keycardSharedState.enterKeycardName: return qsTr("Next") case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: if (root.sharedKeycardModule.keycardData & Constants.predefinedKeycardData.disableSeedPhraseForUnlock) return qsTr("Unlock Keycard") return qsTr("Next") case Constants.keycardSharedState.creatingAccountNewSeedPhrase: case Constants.keycardSharedState.creatingAccountNewSeedPhraseSuccess: case Constants.keycardSharedState.creatingAccountNewSeedPhraseFailure: return qsTr("Done") case Constants.keycardSharedState.manageKeycardAccounts: return qsTr("Finalise Keycard") } break case Constants.keycardSharedFlow.setupNewKeycardOldSeedPhrase: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.keycardNotEmpty: return qsTr("Check what is stored on this Keycard") case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: return qsTr("I don’t know the PIN") case Constants.keycardSharedState.factoryResetConfirmation: case Constants.keycardSharedState.factoryResetConfirmationDisplayMetadata: return qsTr("Factory reset this Keycard") case Constants.keycardSharedState.keycardEmptyMetadata: case Constants.keycardSharedState.keycardMetadataDisplay: case Constants.keycardSharedState.factoryResetSuccess: case Constants.keycardSharedState.createPin: case Constants.keycardSharedState.repeatPin: case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.pinSet: case Constants.keycardSharedState.enterKeycardName: case Constants.keycardSharedState.enterSeedPhrase: return qsTr("Next") case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: if (root.sharedKeycardModule.keycardData & Constants.predefinedKeycardData.disableSeedPhraseForUnlock) return qsTr("Unlock Keycard") return qsTr("Next") case Constants.keycardSharedState.creatingAccountOldSeedPhrase: case Constants.keycardSharedState.creatingAccountOldSeedPhraseSuccess: case Constants.keycardSharedState.creatingAccountOldSeedPhraseFailure: return qsTr("Done") case Constants.keycardSharedState.manageKeycardAccounts: return qsTr("Finalise Keycard") } break case Constants.keycardSharedFlow.factoryReset: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: return qsTr("I don’t know the PIN") case Constants.keycardSharedState.factoryResetConfirmation: case Constants.keycardSharedState.factoryResetConfirmationDisplayMetadata: return qsTr("Factory reset this Keycard") case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.keycardMetadataDisplay: case Constants.keycardSharedState.keycardEmptyMetadata: return qsTr("Next") case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: return qsTr("Unlock Keycard") case Constants.keycardSharedState.keycardEmpty: case Constants.keycardSharedState.factoryResetSuccess: return qsTr("Done") } break case Constants.keycardSharedFlow.authentication: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.wrongPin: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.biometricsReadyToSign: case Constants.keycardSharedState.wrongKeycard: case Constants.keycardSharedState.enterPassword: case Constants.keycardSharedState.wrongPassword: case Constants.keycardSharedState.enterPin: return qsTr("Authenticate") case Constants.keycardSharedState.keycardEmpty: return qsTr("Done") case Constants.keycardSharedState.enterBiometricsPassword: case Constants.keycardSharedState.wrongBiometricsPassword: return qsTr("Update password & authenticate") case Constants.keycardSharedState.wrongKeychainPin: return qsTr("Update PIN & authenticate") case Constants.keycardSharedState.biometricsPasswordFailed: case Constants.keycardSharedState.biometricsPinFailed: case Constants.keycardSharedState.biometricsPinInvalid: return qsTr("Try biometrics again") case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: return qsTr("Unlock Keycard") } break case Constants.keycardSharedFlow.unlockKeycard: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.keycardEmpty: case Constants.keycardSharedState.keycardAlreadyUnlocked: case Constants.keycardSharedState.wrongKeycard: case Constants.keycardSharedState.unlockKeycardSuccess: return qsTr("Done") case Constants.keycardSharedState.unlockKeycardOptions: if (root.sharedKeycardModule.keycardData & Constants.predefinedKeycardData.disableSeedPhraseForUnlock && !(root.sharedKeycardModule.keycardData & Constants.predefinedKeycardData.offerPukForUnlock)) { // In case max puk retries or free pairing slots is reached and user is running unlock flow from a flow // where we cannot determine key pair, than we should should display only "Close" button and inform him // to run unlock flow directly. return "" } return qsTr("Unlock using seed phrase") case Constants.keycardSharedState.createPin: case Constants.keycardSharedState.repeatPin: case Constants.keycardSharedState.pinSet: case Constants.keycardSharedState.enterSeedPhrase: case Constants.keycardSharedState.enterPuk: case Constants.keycardSharedState.wrongPuk: return qsTr("Next") case Constants.keycardSharedState.wrongSeedPhrase: return qsTr("Try entering seed phrase again") case Constants.keycardSharedState.maxPukRetriesReached: if (root.sharedKeycardModule.keycardData & Constants.predefinedKeycardData.disableSeedPhraseForUnlock) { return "" } return qsTr("Unlock Keycard") } break case Constants.keycardSharedFlow.displayKeycardContent: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.keycardEmpty: case Constants.keycardSharedState.keycardEmptyMetadata: case Constants.keycardSharedState.keycardMetadataDisplay: return qsTr("Done") case Constants.keycardSharedState.wrongPin: return qsTr("I don’t know the PIN") case Constants.keycardSharedState.pinVerified: return qsTr("Next") case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: return qsTr("Unlock Keycard") } break case Constants.keycardSharedFlow.renameKeycard: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.wrongKeycard: case Constants.keycardSharedState.keycardEmptyMetadata: case Constants.keycardSharedState.keycardRenameSuccess: case Constants.keycardSharedState.keycardRenameFailure: case Constants.keycardSharedState.renamingKeycard: return qsTr("Done") case Constants.keycardSharedState.wrongPin: return qsTr("I don’t know the PIN") case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.keycardMetadataDisplay: return qsTr("Next") case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: return qsTr("Unlock Keycard") case Constants.keycardSharedState.enterKeycardName: return qsTr("Rename this Keycard") } break case Constants.keycardSharedFlow.changeKeycardPin: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.wrongKeycard: case Constants.keycardSharedState.changingKeycardPin: case Constants.keycardSharedState.changingKeycardPinSuccess: case Constants.keycardSharedState.changingKeycardPinFailure: return qsTr("Done") case Constants.keycardSharedState.wrongPin: return qsTr("I don’t know the PIN") case Constants.keycardSharedState.pinVerified: return qsTr("Next") case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: return qsTr("Unlock Keycard") } break case Constants.keycardSharedFlow.changeKeycardPuk: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.wrongKeycard: case Constants.keycardSharedState.changingKeycardPuk: case Constants.keycardSharedState.changingKeycardPukSuccess: case Constants.keycardSharedState.changingKeycardPukFailure: return qsTr("Done") case Constants.keycardSharedState.wrongPin: return qsTr("I don’t know the PIN") case Constants.keycardSharedState.pinVerified: return qsTr("Next") case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: return qsTr("Unlock Keycard") } break case Constants.keycardSharedFlow.changePairingCode: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.wrongKeycard: case Constants.keycardSharedState.changingKeycardPairingCode: case Constants.keycardSharedState.changingKeycardPairingCodeSuccess: case Constants.keycardSharedState.changingKeycardPairingCodeFailure: return qsTr("Done") case Constants.keycardSharedState.wrongPin: return qsTr("I don’t know the PIN") case Constants.keycardSharedState.pinVerified: return qsTr("Next") case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: return qsTr("Unlock Keycard") case Constants.keycardSharedState.createPairingCode: return qsTr("Set paring code") } break case Constants.keycardSharedFlow.createCopyOfAKeycard: let copyFromAKeycardPartDone = root.sharedKeycardModule.keycardData & Constants.predefinedKeycardData.copyFromAKeycardPartDone switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.enterPin: case Constants.keycardSharedState.wrongPin: if (copyFromAKeycardPartDone) { return qsTr("I don’t know the PIN") } break case Constants.keycardSharedState.wrongKeycard: case Constants.keycardSharedState.keycardEmpty: case Constants.keycardSharedState.copyingKeycard: case Constants.keycardSharedState.copyingKeycardSuccess: case Constants.keycardSharedState.copyingKeycardFailure: return qsTr("Done") case Constants.keycardSharedState.pinVerified: case Constants.keycardSharedState.keycardMetadataDisplay: case Constants.keycardSharedState.removeKeycard: case Constants.keycardSharedState.factoryResetSuccess: case Constants.keycardSharedState.copyToKeycard: case Constants.keycardSharedState.enterSeedPhrase: return qsTr("Next") case Constants.keycardSharedState.keycardEmptyMetadata: if (copyFromAKeycardPartDone) { return qsTr("Next") } return qsTr("Done") case Constants.keycardSharedState.wrongSeedPhrase: return qsTr("Try entering seed phrase again") case Constants.keycardSharedState.maxPinRetriesReached: case Constants.keycardSharedState.maxPukRetriesReached: case Constants.keycardSharedState.maxPairingSlotsReached: return qsTr("Unlock Keycard") case Constants.keycardSharedState.sameKeycard: return qsTr("Try inserting a different Keycard") case Constants.keycardSharedState.notKeycard: if (copyFromAKeycardPartDone) { return qsTr("Try inserting a different Keycard") } break case Constants.keycardSharedState.keycardNotEmpty: return qsTr("Check what is stored on this Keycard") case Constants.keycardSharedState.factoryResetConfirmation: case Constants.keycardSharedState.factoryResetConfirmationDisplayMetadata: return qsTr("Factory reset this Keycard") } break } return "" } visible: text !== "" enabled: { switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.migratingKeyPair: case Constants.keycardSharedState.creatingAccountNewSeedPhrase: case Constants.keycardSharedState.creatingAccountOldSeedPhrase: case Constants.keycardSharedState.renamingKeycard: case Constants.keycardSharedState.changingKeycardPin: case Constants.keycardSharedState.changingKeycardPuk: case Constants.keycardSharedState.changingKeycardPairingCode: case Constants.keycardSharedState.copyingKeycard: if (root.disablePopupClose) { return false } } switch (root.sharedKeycardModule.currentState.flowType) { case Constants.keycardSharedFlow.setupNewKeycard: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.selectExistingKeyPair: case Constants.keycardSharedState.factoryResetConfirmation: case Constants.keycardSharedState.factoryResetConfirmationDisplayMetadata: case Constants.keycardSharedState.seedPhraseDisplay: case Constants.keycardSharedState.seedPhraseEnterWords: case Constants.keycardSharedState.enterSeedPhrase: return root.primaryButtonEnabled case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.recognizedKeycard: case Constants.keycardSharedState.createPin: case Constants.keycardSharedState.repeatPin: return false } break case Constants.keycardSharedFlow.setupNewKeycardNewSeedPhrase: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.factoryResetConfirmation: case Constants.keycardSharedState.factoryResetConfirmationDisplayMetadata: case Constants.keycardSharedState.seedPhraseDisplay: case Constants.keycardSharedState.seedPhraseEnterWords: case Constants.keycardSharedState.enterKeycardName: case Constants.keycardSharedState.manageKeycardAccounts: return root.primaryButtonEnabled case Constants.keycardSharedState.createPin: case Constants.keycardSharedState.repeatPin: return false } break case Constants.keycardSharedFlow.setupNewKeycardOldSeedPhrase: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.factoryResetConfirmation: case Constants.keycardSharedState.factoryResetConfirmationDisplayMetadata: case Constants.keycardSharedState.enterKeycardName: case Constants.keycardSharedState.manageKeycardAccounts: case Constants.keycardSharedState.enterSeedPhrase: return root.primaryButtonEnabled case Constants.keycardSharedState.createPin: case Constants.keycardSharedState.repeatPin: return false } break case Constants.keycardSharedFlow.factoryReset: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.factoryResetConfirmation: case Constants.keycardSharedState.factoryResetConfirmationDisplayMetadata: return root.primaryButtonEnabled } break case Constants.keycardSharedFlow.authentication: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.wrongPin: case Constants.keycardSharedState.wrongKeychainPin: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.wrongKeycard: case Constants.keycardSharedState.enterPassword: case Constants.keycardSharedState.wrongPassword: case Constants.keycardSharedState.enterBiometricsPassword: case Constants.keycardSharedState.wrongBiometricsPassword: case Constants.keycardSharedState.enterPin: return root.primaryButtonEnabled } break case Constants.keycardSharedFlow.unlockKeycard: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.enterSeedPhrase: case Constants.keycardSharedState.enterPuk: case Constants.keycardSharedState.wrongPuk: return root.primaryButtonEnabled case Constants.keycardSharedState.createPin: case Constants.keycardSharedState.repeatPin: return false case Constants.keycardSharedState.unlockKeycardOptions: return !(root.sharedKeycardModule.keycardData & Constants.predefinedKeycardData.disableSeedPhraseForUnlock) } break case Constants.keycardSharedFlow.renameKeycard: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.enterKeycardName: return root.primaryButtonEnabled } break case Constants.keycardSharedFlow.changePairingCode: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.createPairingCode: return root.primaryButtonEnabled } break case Constants.keycardSharedFlow.createCopyOfAKeycard: switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.factoryResetConfirmation: case Constants.keycardSharedState.factoryResetConfirmationDisplayMetadata: case Constants.keycardSharedState.enterSeedPhrase: return root.primaryButtonEnabled } break } return true } icon.name: { switch (root.sharedKeycardModule.currentState.flowType) { case Constants.keycardSharedFlow.setupNewKeycard: if (root.sharedKeycardModule.migratingProfileKeyPair()) { switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.seedPhraseEnterWords: case Constants.keycardSharedState.enterSeedPhrase: if (userProfile.usingBiometricLogin) return "touch-id" if (userProfile.isKeycardUser) return "keycard" return "password" } } break case Constants.keycardSharedFlow.authentication: if (userProfile.usingBiometricLogin) { switch (root.sharedKeycardModule.currentState.stateType) { case Constants.keycardSharedState.pluginReader: case Constants.keycardSharedState.insertKeycard: case Constants.keycardSharedState.keycardInserted: case Constants.keycardSharedState.readingKeycard: case Constants.keycardSharedState.biometricsPasswordFailed: case Constants.keycardSharedState.biometricsPinFailed: case Constants.keycardSharedState.biometricsPinInvalid: case Constants.keycardSharedState.biometricsReadyToSign: case Constants.keycardSharedState.notKeycard: case Constants.keycardSharedState.wrongKeycard: return "touch-id" } } break } return "" } onClicked: { root.sharedKeycardModule.currentState.doPrimaryAction() } } ] }