diff --git a/src/app/modules/onboarding/module.nim b/src/app/modules/onboarding/module.nim index 346fbeeb514..cc8c451d6a0 100644 --- a/src/app/modules/onboarding/module.nim +++ b/src/app/modules/onboarding/module.nim @@ -21,7 +21,7 @@ export io_interface logScope: topics = "onboarding-module" -type SecondaryFlow* {.pure} = enum +type OnboardingFlow* {.pure} = enum Unknown = 0, CreateProfileWithPassword, CreateProfileWithSeedphrase, @@ -30,9 +30,9 @@ type SecondaryFlow* {.pure} = enum LoginWithSeedphrase, LoginWithSyncing, LoginWithKeycard, - ActualLogin, # TODO get the real name and value for this when it's implemented on the front-end type LoginMethod* {.pure} = enum + Unknown = 0, Password, Keycard, @@ -49,7 +49,7 @@ type controller: Controller localPairingStatus: LocalPairingStatus loginFlow: LoginMethod - currentFlow: SecondaryFlow + onboardingFlow: OnboardingFlow exportedKeys: KeycardExportedKeysDto proc newModule*[T]( @@ -64,6 +64,8 @@ proc newModule*[T]( result.delegate = delegate result.view = view.newView(result) result.viewVariant = newQVariant(result.view) + result.onboardingFlow = OnboardingFlow.Unknown + result.loginFlow = LoginMethod.Unknown result.controller = controller.newController( result, events, @@ -136,7 +138,7 @@ method loadMnemonic*[T](self: Module[T], mnemonic: string) = method finishOnboardingFlow*[T](self: Module[T], flowInt: int, dataJson: string): string = try: - self.currentFlow = SecondaryFlow(flowInt) + self.onboardingFlow = OnboardingFlow(flowInt) let data = parseJson(dataJson) let password = data["password"].str @@ -144,18 +146,18 @@ method finishOnboardingFlow*[T](self: Module[T], flowInt: int, dataJson: string) var err = "" - case self.currentFlow: + case self.onboardingFlow: # CREATE PROFILE FLOWS - of SecondaryFlow.CreateProfileWithPassword: + of OnboardingFlow.CreateProfileWithPassword: err = self.controller.createAccountAndLogin(password) - of SecondaryFlow.CreateProfileWithSeedphrase: + of OnboardingFlow.CreateProfileWithSeedphrase: err = self.controller.restoreAccountAndLogin( password, seedPhrase, recoverAccount = false, keycardInstanceUID = "", ) - of SecondaryFlow.CreateProfileWithKeycardNewSeedphrase: + of OnboardingFlow.CreateProfileWithKeycardNewSeedphrase: # New user with a seedphrase we showed them let keycardEvent = self.view.getKeycardEvent() err = self.controller.restoreAccountAndLogin( @@ -164,7 +166,7 @@ method finishOnboardingFlow*[T](self: Module[T], flowInt: int, dataJson: string) recoverAccount = false, keycardInstanceUID = keycardEvent.keycardInfo.instanceUID, ) - of SecondaryFlow.CreateProfileWithKeycardExistingSeedphrase: + of OnboardingFlow.CreateProfileWithKeycardExistingSeedphrase: # New user who entered their own seed phrase let keycardEvent = self.view.getKeycardEvent() err = self.controller.restoreAccountAndLogin( @@ -175,21 +177,21 @@ method finishOnboardingFlow*[T](self: Module[T], flowInt: int, dataJson: string) ) # LOGIN FLOWS - of SecondaryFlow.LoginWithSeedphrase: + of OnboardingFlow.LoginWithSeedphrase: err = self.controller.restoreAccountAndLogin( password, seedPhrase, recoverAccount = true, keycardInstanceUID = "", ) - of SecondaryFlow.LoginWithSyncing: + of OnboardingFlow.LoginWithSyncing: # The pairing was already done directly through inputConnectionStringForBootstrapping, we can login self.controller.loginLocalPairingAccount( self.localPairingStatus.account, self.localPairingStatus.password, self.localPairingStatus.chatKey, ) - of SecondaryFlow.LoginWithKeycard: + of OnboardingFlow.LoginWithKeycard: err = self.controller.restoreKeycardAccountAndLogin( self.view.getKeycardEvent().keycardInfo.keyUID, self.view.getKeycardEvent().keycardInfo.instanceUID, @@ -197,7 +199,7 @@ method finishOnboardingFlow*[T](self: Module[T], flowInt: int, dataJson: string) recoverAccount = true ) else: - raise newException(ValueError, "Unknown flow: " & $self.currentFlow) + raise newException(ValueError, "Unknown flow: " & $self.onboardingFlow) return err except Exception as e: @@ -218,20 +220,20 @@ method loginRequested*[T](self: Module[T], keyUid: string, loginFlow: int, dataJ self.authorize(data["pin"].str) # We will continue the flow when the card is authorized in onKeycardStateUpdated else: - raise newException(ValueError, "Unknown flow: " & $self.currentFlow) + raise newException(ValueError, "Unknown flow: " & $self.onboardingFlow) except Exception as e: - error "Error finishing Onboarding Flow", msg = e.msg + error "Error finishing Login Flow", msg = e.msg + self.view.accountLoginFailed(e.msg, wrongPassword = false) proc finishAppLoading2[T](self: Module[T]) = self.delegate.appReady() - # TODO get the flow to send the right metric var eventType = "user-logged-in" - if self.currentFlow != SecondaryFlow.ActualLogin: + if self.loginFlow == LoginMethod.Unknown: eventType = "onboarding-completed" singletonInstance.globalEvents.addCentralizedMetricIfEnabled(eventType, - $(%*{"flowType": repr(self.currentFlow)})) + $(%*{"flowType": repr(self.onboardingFlow)})) self.controller.stopKeycardService() diff --git a/ui/StatusQ/src/onboarding/enums.h b/ui/StatusQ/src/onboarding/enums.h index ff8261a08c5..59e9a0e726c 100644 --- a/ui/StatusQ/src/onboarding/enums.h +++ b/ui/StatusQ/src/onboarding/enums.h @@ -11,7 +11,7 @@ class OnboardingEnums Login }; - enum class SecondaryFlow { + enum class OnboardingFlow { Unknown, CreateProfileWithPassword, @@ -25,6 +25,7 @@ class OnboardingEnums }; enum class LoginMethod { + Unknown, Password, Keycard, }; @@ -60,7 +61,7 @@ class OnboardingEnums private: Q_ENUM(PrimaryFlow) - Q_ENUM(SecondaryFlow) + Q_ENUM(OnboardingFlow) Q_ENUM(LoginMethod) Q_ENUM(KeycardState) Q_ENUM(AddKeyPairState) diff --git a/ui/app/AppLayouts/Onboarding2/OnboardingFlow.qml b/ui/app/AppLayouts/Onboarding2/OnboardingFlow.qml index 75261b688dd..79e528b7875 100644 --- a/ui/app/AppLayouts/Onboarding2/OnboardingFlow.qml +++ b/ui/app/AppLayouts/Onboarding2/OnboardingFlow.qml @@ -126,7 +126,7 @@ SQUtils.QObject { CreateProfilePage { onCreateProfileWithPasswordRequested: createNewProfileFlow.init() onCreateProfileWithSeedphraseRequested: { - d.flow = Onboarding.SecondaryFlow.CreateProfileWithSeedphrase + d.flow = Onboarding.OnboardingFlow.CreateProfileWithSeedphrase useRecoveryPhraseFlow.init() } onCreateProfileWithEmptyKeycardRequested: keycardCreateProfileFlow.init() @@ -143,7 +143,7 @@ SQUtils.QObject { onLoginWithKeycardRequested: loginWithKeycardFlow.init() onLoginWithSeedphraseRequested: { - d.flow = Onboarding.SecondaryFlow.LoginWithSeedphrase + d.flow = Onboarding.OnboardingFlow.LoginWithSeedphrase useRecoveryPhraseFlow.init() } } @@ -157,7 +157,7 @@ SQUtils.QObject { onFinished: (password) => { root.setPasswordRequested(password) - d.flow = Onboarding.SecondaryFlow.CreateProfileWithPassword + d.flow = Onboarding.OnboardingFlow.CreateProfileWithPassword d.pushOrSkipBiometricsPage() } } @@ -205,8 +205,8 @@ SQUtils.QObject { onFinished: (withNewSeedphrase) => { d.flow = withNewSeedphrase - ? Onboarding.SecondaryFlow.CreateProfileWithKeycardNewSeedphrase - : Onboarding.SecondaryFlow.CreateProfileWithKeycardExistingSeedphrase + ? Onboarding.OnboardingFlow.CreateProfileWithKeycardNewSeedphrase + : Onboarding.OnboardingFlow.CreateProfileWithKeycardExistingSeedphrase d.pushOrSkipBiometricsPage() } @@ -223,12 +223,12 @@ SQUtils.QObject { root.syncProceedWithConnectionString(connectionString) onLoginWithSeedphraseRequested: { - d.flow = Onboarding.SecondaryFlow.LoginWithSeedphrase + d.flow = Onboarding.OnboardingFlow.LoginWithSeedphrase useRecoveryPhraseFlow.init() } onFinished: { - d.flow = Onboarding.SecondaryFlow.LoginWithSyncing + d.flow = Onboarding.OnboardingFlow.LoginWithSyncing d.pushOrSkipBiometricsPage() } } @@ -253,7 +253,7 @@ SQUtils.QObject { onExportKeysRequested: root.exportKeysRequested() onFinished: { - d.flow = Onboarding.SecondaryFlow.LoginWithKeycard + d.flow = Onboarding.OnboardingFlow.LoginWithKeycard d.pushOrSkipBiometricsPage() } } diff --git a/ui/app/AppLayouts/Onboarding2/OnboardingLayout.qml b/ui/app/AppLayouts/Onboarding2/OnboardingLayout.qml index 3b4b22f5079..a0c560b41a9 100644 --- a/ui/app/AppLayouts/Onboarding2/OnboardingLayout.qml +++ b/ui/app/AppLayouts/Onboarding2/OnboardingLayout.qml @@ -33,7 +33,7 @@ Page { signal shareUsageDataRequested(bool enabled) - // flow: Onboarding.SecondaryFlow + // flow: Onboarding.OnboardingFlow signal finished(int flow, var data) // -> "keyUid:string": User ID to login; "method:int": password or keycard (cf Onboarding.LoginMethod.*) enum; diff --git a/ui/main.qml b/ui/main.qml index 3efe8114d3b..a67cf86f15f 100644 --- a/ui/main.qml +++ b/ui/main.qml @@ -446,23 +446,20 @@ StatusWindow { onboardingStore: onboardingStore onFinished: (flow, data) => { - console.log("!!! ONBOARDING FINISHED; flow:", flow, "; data:", JSON.stringify(data)) - let error = onboardingStore.finishOnboardingFlow(flow, data) if (error != "") { + // We should never be here since everything should be validated already console.error("!!! ONBOARDING FINISHED WITH ERROR:", error) - // TODO show error return } - console.log("!!! Onboarding completed!") stack.clear() stack.push(splashScreenV2, { runningProgressAnimation: true }) } onLoginRequested: function (keyUid, method, data) { - onboardingStore.loginRequested(keyUid, method, data) stack.push(splashScreenV2, { runningProgressAnimation: true }) + onboardingStore.loginRequested(keyUid, method, data) } onShareUsageDataRequested: {