From eb5ad8c911d74c5cbe4c371e98c4b59c37112b4a Mon Sep 17 00:00:00 2001 From: Sale Djenic Date: Thu, 29 Sep 2022 09:41:20 +0200 Subject: [PATCH] fix(@desktop/keycard): onboarding flow `I'm new to Status` -> `Import a seed phrase` -> `Import a seed phrase into a new Keycard` updated Onboarding flow updated according to the latest related figma changes. --- .../internal/keycard_create_pin_state.nim | 5 +++-- .../internal/keycard_insert_keycard_state.nim | 5 +++-- .../internal/keycard_inserted_keycard_state.nim | 5 +++-- .../internal/keycard_plugin_reader_state.nim | 5 +++-- .../internal/keycard_reading_keycard_state.nim | 5 +++-- .../keycard_recognized_keycard_state.nim | 7 +++++-- .../modules/startup/internal/state_factory.nim | 17 ++++++++++++----- .../user_profile_enter_seed_phrase_state.nim | 2 +- .../user_profile_import_seed_phrase_state.nim | 13 +++++++++++-- src/app_service/service/keycard/service.nim | 4 +--- .../Onboarding/views/KeycardPinView.qml | 1 + 11 files changed, 46 insertions(+), 23 deletions(-) diff --git a/src/app/modules/startup/internal/keycard_create_pin_state.nim b/src/app/modules/startup/internal/keycard_create_pin_state.nim index 1d58d5e2c1..38d80494d4 100644 --- a/src/app/modules/startup/internal/keycard_create_pin_state.nim +++ b/src/app/modules/startup/internal/keycard_create_pin_state.nim @@ -13,8 +13,9 @@ proc delete*(self: KeycardCreatePinState) = method executeBackCommand*(self: KeycardCreatePinState, controller: Controller) = controller.setPin("") controller.setPinMatch(false) - if self.flowType == FlowType.FirstRunNewUserNewKeycardKeys: - controller.cancelCurrentFlow() + if self.flowType == FlowType.FirstRunNewUserNewKeycardKeys or + self.flowType == FlowType.FirstRunNewUserImportSeedPhraseIntoKeycard: + controller.cancelCurrentFlow() method getNextPrimaryState*(self: KeycardCreatePinState, controller: Controller): State = if not self.pinValid: diff --git a/src/app/modules/startup/internal/keycard_insert_keycard_state.nim b/src/app/modules/startup/internal/keycard_insert_keycard_state.nim index ea62d9b3ad..390ca3e783 100644 --- a/src/app/modules/startup/internal/keycard_insert_keycard_state.nim +++ b/src/app/modules/startup/internal/keycard_insert_keycard_state.nim @@ -9,8 +9,9 @@ proc delete*(self: KeycardInsertKeycardState) = self.State.delete method executeBackCommand*(self: KeycardInsertKeycardState, controller: Controller) = - if self.flowType == FlowType.FirstRunNewUserNewKeycardKeys: - controller.cancelCurrentFlow() + if self.flowType == FlowType.FirstRunNewUserNewKeycardKeys or + self.flowType == FlowType.FirstRunNewUserImportSeedPhraseIntoKeycard: + controller.cancelCurrentFlow() method resolveKeycardNextState*(self: KeycardInsertKeycardState, keycardFlowType: string, keycardEvent: KeycardEvent, controller: Controller): State = diff --git a/src/app/modules/startup/internal/keycard_inserted_keycard_state.nim b/src/app/modules/startup/internal/keycard_inserted_keycard_state.nim index 3935638e1c..fa1bbb5215 100644 --- a/src/app/modules/startup/internal/keycard_inserted_keycard_state.nim +++ b/src/app/modules/startup/internal/keycard_inserted_keycard_state.nim @@ -9,8 +9,9 @@ proc delete*(self: KeycardInsertedKeycardState) = self.State.delete method executeBackCommand*(self: KeycardInsertedKeycardState, controller: Controller) = - if self.flowType == FlowType.FirstRunNewUserNewKeycardKeys: - controller.cancelCurrentFlow() + if self.flowType == FlowType.FirstRunNewUserNewKeycardKeys or + self.flowType == FlowType.FirstRunNewUserImportSeedPhraseIntoKeycard: + controller.cancelCurrentFlow() method getNextPrimaryState*(self: KeycardInsertedKeycardState, controller: Controller): State = return createState(StateType.KeycardReadingKeycard, self.flowType, self.getBackState) diff --git a/src/app/modules/startup/internal/keycard_plugin_reader_state.nim b/src/app/modules/startup/internal/keycard_plugin_reader_state.nim index bb2a0d103b..0154fd0bee 100644 --- a/src/app/modules/startup/internal/keycard_plugin_reader_state.nim +++ b/src/app/modules/startup/internal/keycard_plugin_reader_state.nim @@ -9,8 +9,9 @@ proc delete*(self: KeycardPluginReaderState) = self.State.delete method executeBackCommand*(self: KeycardPluginReaderState, controller: Controller) = - if self.flowType == FlowType.FirstRunNewUserNewKeycardKeys: - controller.cancelCurrentFlow() + if self.flowType == FlowType.FirstRunNewUserNewKeycardKeys or + self.flowType == FlowType.FirstRunNewUserImportSeedPhraseIntoKeycard: + controller.cancelCurrentFlow() method resolveKeycardNextState*(self: KeycardPluginReaderState, keycardFlowType: string, keycardEvent: KeycardEvent, controller: Controller): State = diff --git a/src/app/modules/startup/internal/keycard_reading_keycard_state.nim b/src/app/modules/startup/internal/keycard_reading_keycard_state.nim index d536810283..a8c10d7e2c 100644 --- a/src/app/modules/startup/internal/keycard_reading_keycard_state.nim +++ b/src/app/modules/startup/internal/keycard_reading_keycard_state.nim @@ -9,8 +9,9 @@ proc delete*(self: KeycardReadingKeycardState) = self.State.delete method executeBackCommand*(self: KeycardReadingKeycardState, controller: Controller) = - if self.flowType == FlowType.FirstRunNewUserNewKeycardKeys: - controller.cancelCurrentFlow() + if self.flowType == FlowType.FirstRunNewUserNewKeycardKeys or + self.flowType == FlowType.FirstRunNewUserImportSeedPhraseIntoKeycard: + controller.cancelCurrentFlow() method getNextPrimaryState*(self: KeycardReadingKeycardState, controller: Controller): State = let (flowType, flowEvent) = controller.getLastReceivedKeycardData() diff --git a/src/app/modules/startup/internal/keycard_recognized_keycard_state.nim b/src/app/modules/startup/internal/keycard_recognized_keycard_state.nim index 4360b130c6..ed3cfbfc5f 100644 --- a/src/app/modules/startup/internal/keycard_recognized_keycard_state.nim +++ b/src/app/modules/startup/internal/keycard_recognized_keycard_state.nim @@ -9,9 +9,12 @@ proc delete*(self: KeycardRecognizedKeycardState) = self.State.delete method executeBackCommand*(self: KeycardRecognizedKeycardState, controller: Controller) = - if self.flowType == FlowType.FirstRunNewUserNewKeycardKeys: - controller.cancelCurrentFlow() + if self.flowType == FlowType.FirstRunNewUserNewKeycardKeys or + self.flowType == FlowType.FirstRunNewUserImportSeedPhraseIntoKeycard: + controller.cancelCurrentFlow() method getNextPrimaryState*(self: KeycardRecognizedKeycardState, controller: Controller): State = if self.flowType == FlowType.FirstRunNewUserNewKeycardKeys: return createState(StateType.KeycardCreatePin, self.flowType, self.getBackState) + if self.flowType == FlowType.FirstRunNewUserImportSeedPhraseIntoKeycard: + return createState(StateType.UserProfileEnterSeedPhrase, self.flowType, self.getBackState) diff --git a/src/app/modules/startup/internal/state_factory.nim b/src/app/modules/startup/internal/state_factory.nim index 0043303f89..ac85076f03 100644 --- a/src/app/modules/startup/internal/state_factory.nim +++ b/src/app/modules/startup/internal/state_factory.nim @@ -230,15 +230,22 @@ proc ensureReaderAndCardPresenceAndResolveNextOnboardingState*(state: State, key if keycardFlowType == ResponseTypeValueEnterNewPIN and keycardEvent.error.len > 0 and keycardEvent.error == ErrorRequireInit: - return createState(StateType.KeycardCreatePin, state.flowType, state.getBackState) + if state.stateType == StateType.UserProfileEnterSeedPhrase: + return createState(StateType.KeycardCreatePin, state.flowType, state.getBackState) + return createState(StateType.KeycardRecognizedKeycard, state.flowType, state.getBackState) if keycardFlowType == ResponseTypeValueEnterPIN and keycardEvent.error.len == 0: return createState(StateType.KeycardNotEmpty, state.flowType, state.getBackState) if keycardFlowType == ResponseTypeValueSwapCard and - keycardEvent.error.len > 0 and - (keycardEvent.error == ErrorHasKeys or - keycardEvent.error == RequestParamPUKRetries): - return createState(StateType.KeycardNotEmpty, state.flowType, state.getBackState) + keycardEvent.error.len > 0: + if keycardEvent.error == ErrorNotAKeycard: + return createState(StateType.KeycardNotKeycard, state.flowType, state.getBackState) + if keycardEvent.error == RequestParamFreeSlots: + return createState(StateType.KeycardLocked, state.flowType, state.getBackState) + if keycardEvent.error == RequestParamPUKRetries: + return createState(StateType.KeycardLocked, state.flowType, state.getBackState) + if keycardEvent.error == ErrorHasKeys: + return createState(StateType.KeycardNotEmpty, state.flowType, state.getBackState) if keycardFlowType == ResponseTypeValueKeycardFlowResult and keycardEvent.keyUid.len > 0: controller.setKeyUid(keycardEvent.keyUid) diff --git a/src/app/modules/startup/internal/user_profile_enter_seed_phrase_state.nim b/src/app/modules/startup/internal/user_profile_enter_seed_phrase_state.nim index de1fbcea78..77e393d2eb 100644 --- a/src/app/modules/startup/internal/user_profile_enter_seed_phrase_state.nim +++ b/src/app/modules/startup/internal/user_profile_enter_seed_phrase_state.nim @@ -31,7 +31,7 @@ method executePrimaryCommand*(self: UserProfileEnterSeedPhraseState, controller: self.successfulImport = controller.importMnemonic() if self.successfulImport: if self.flowType == FlowType.FirstRunNewUserImportSeedPhraseIntoKeycard: - controller.runLoadAccountFlow(controller.getSeedPhraseLength(), controller.getSeedPhrase(), puk = "", factoryReset = true) + controller.storeSeedPhraseToKeycard(controller.getSeedPhraseLength(), controller.getSeedPhrase()) elif self.flowType == FlowType.FirstRunOldUserKeycardImport: controller.runLoadAccountFlow(controller.getSeedPhraseLength(), controller.getSeedPhrase(), puk = "", factoryReset = true) diff --git a/src/app/modules/startup/internal/user_profile_import_seed_phrase_state.nim b/src/app/modules/startup/internal/user_profile_import_seed_phrase_state.nim index 63232c1a2c..9e27e3609a 100644 --- a/src/app/modules/startup/internal/user_profile_import_seed_phrase_state.nim +++ b/src/app/modules/startup/internal/user_profile_import_seed_phrase_state.nim @@ -8,8 +8,17 @@ proc newUserProfileImportSeedPhraseState*(flowType: FlowType, backState: State): proc delete*(self: UserProfileImportSeedPhraseState) = self.State.delete +method executeBackCommand*(self: UserProfileImportSeedPhraseState, controller: Controller) = + if self.flowType == FlowType.FirstRunNewUserImportSeedPhraseIntoKeycard: + controller.cancelCurrentFlow() + method getNextPrimaryState*(self: UserProfileImportSeedPhraseState, controller: Controller): State = return createState(StateType.UserProfileEnterSeedPhrase, FlowType.FirstRunNewUserImportSeedPhrase, self) -method getNextSecondaryState*(self: UserProfileImportSeedPhraseState, controller: Controller): State = - return createState(StateType.UserProfileEnterSeedPhrase, FlowType.FirstRunNewUserImportSeedPhraseIntoKeycard, self.getBackState) \ No newline at end of file +method executeSecondaryCommand*(self: UserProfileImportSeedPhraseState, controller: Controller) = + self.setFlowType(FlowType.FirstRunNewUserImportSeedPhraseIntoKeycard) + controller.runLoadAccountFlow() + +method resolveKeycardNextState*(self: UserProfileImportSeedPhraseState, keycardFlowType: string, keycardEvent: KeycardEvent, + controller: Controller): State = + return ensureReaderAndCardPresenceAndResolveNextOnboardingState(self, keycardFlowType, keycardEvent, controller) \ No newline at end of file diff --git a/src/app_service/service/keycard/service.nim b/src/app_service/service/keycard/service.nim index 3595996001..1ade5f1526 100644 --- a/src/app_service/service/keycard/service.nim +++ b/src/app_service/service/keycard/service.nim @@ -159,9 +159,7 @@ QtObject: self.threadpool.start(arg) proc startLoadAccountFlow*(self: Service, seedPhraseLength: int, seedPhrase: string, puk: string, factoryReset: bool) = - var payload = %* { - RequestParamOverwrite: true - } + var payload = %* { } if seedPhrase.len > 0 and seedPhraseLength > 0: payload[RequestParamMnemonic] = %* seedPhrase payload[RequestParamMnemonicLen] = %* seedPhraseLength diff --git a/ui/app/AppLayouts/Onboarding/views/KeycardPinView.qml b/ui/app/AppLayouts/Onboarding/views/KeycardPinView.qml index a32931418c..c930b8d616 100644 --- a/ui/app/AppLayouts/Onboarding/views/KeycardPinView.qml +++ b/ui/app/AppLayouts/Onboarding/views/KeycardPinView.qml @@ -133,6 +133,7 @@ Item { PropertyChanges { target: info text: qsTr("It is very important that you do not lose this PIN") + color: Theme.palette.dangerColor1 } PropertyChanges { target: message