Skip to content

Commit

Permalink
Onboarding: LoginScreen location adjusted
Browse files Browse the repository at this point in the history
- LoginScreen SB page simplified
- OnboardingLayoutPage - settings introduced for handier testing
- LoginScreen moved from OnboardingLayout to OnboardingFlow, making first flow's page bound to model content (instead of relying on check during initialization)
- UnblockWithPukFlow removed from OnboardingLayout (now it's used only in OnboardingFlow)
- Login error/success processing extracted from LoginScreen to OnboardingLayout
- small bug fixed in Utils::objectTypeName

Closes: #17160
  • Loading branch information
micieslak committed Jan 29, 2025
1 parent df741d6 commit 6914cc7
Show file tree
Hide file tree
Showing 7 changed files with 198 additions and 140 deletions.
36 changes: 17 additions & 19 deletions storybook/pages/LoginScreenPage.qml
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,12 @@ import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtQuick.Window 2.15
import QtQml.Models 2.15

import StatusQ 0.1
import StatusQ.Core 0.1
import StatusQ.Controls 0.1
import StatusQ.Components 0.1
import StatusQ.Core.Theme 0.1

import Models 1.0
import Storybook 1.0

import AppLayouts.Onboarding.enums 1.0
import AppLayouts.Onboarding2.pages 1.0
import AppLayouts.Onboarding2.stores 1.0

import utils 1.0

Expand All @@ -25,16 +17,16 @@ SplitView {

Logs { id: logs }

OnboardingStore {
id: store
QtObject {
id: driver

// keycard
property int keycardState: Onboarding.KeycardState.NoPCSCService
property int keycardRemainingPinAttempts: 3
property int keycardRemainingPukAttempts: 3

function setPin(pin: string) { // -> bool
logs.logEvent("OnboardingStore.setPin", ["pin"], arguments)
logs.logEvent("setPin", ["pin"], arguments)
const valid = pin === ctrlPin.text
if (!valid)
keycardRemainingPinAttempts-- // SIMULATION: decrease the remaining PIN attempts
Expand All @@ -46,7 +38,7 @@ SplitView {
}

function setPuk(puk) { // -> bool
logs.logEvent("OnboardingStore.setPuk", ["puk"], arguments)
logs.logEvent("setPuk", ["puk"], arguments)
const valid = puk === ctrlPuk.text
if (!valid)
keycardRemainingPukAttempts--
Expand All @@ -71,7 +63,13 @@ SplitView {
SplitView.fillHeight: true

loginAccountsModel: LoginAccountsModel {}
onboardingStore: store

keycardState: driver.keycardState

tryToSetPinFunction: (pin) => driver.setPin(pin)
keycardRemainingPinAttempts: driver.keycardRemainingPinAttempts
keycardRemainingPukAttempts: driver.keycardRemainingPukAttempts

biometricsAvailable: ctrlBiometrics.checked
isBiometricsLogin: localAccountSettings.storeToKeychainValue === Constants.keychain.storedValue.store
onBiometricsRequested: biometricsPopup.open()
Expand All @@ -80,7 +78,7 @@ SplitView {

// SIMULATION: emit an error in case of wrong password
if (method === Onboarding.LoginMethod.Password && data.password !== ctrlPassword.text) {
onboardingStore.accountLoginError("The impossible has happened", Math.random() < 0.5)
driver.accountLoginError("The impossible has happened", Math.random() < 0.5)
}
}
onOnboardingCreateProfileFlowRequested: logs.logEvent("onOnboardingCreateProfileFlowRequested")
Expand All @@ -105,9 +103,9 @@ SplitView {
password: ctrlPassword.text
pin: ctrlPin.text
selectedProfileIsKeycard: loginScreen.selectedProfileIsKeycard
onAccountLoginError: (error, wrongPassword) => store.accountLoginError(error, wrongPassword)
onObtainingPasswordSuccess: (password) => store.obtainingPasswordSuccess(password)
onObtainingPasswordError: (errorDescription, errorType, wrongFingerprint) => store.obtainingPasswordError(errorDescription, errorType, wrongFingerprint)
onAccountLoginError: (error, wrongPassword) => driver.accountLoginError(error, wrongPassword)
onObtainingPasswordSuccess: (password) => driver.obtainingPasswordSuccess(password)
onObtainingPasswordError: (errorDescription, errorType, wrongFingerprint) => driver.obtainingPasswordError(errorDescription, errorType, wrongFingerprint)
}

LogsAndControlsPanel {
Expand Down Expand Up @@ -179,8 +177,8 @@ SplitView {
textRole: "name"
valueRole: "value"
model: Onboarding.getModelFromEnum("KeycardState")
onActivated: store.keycardState = currentValue
Component.onCompleted: currentIndex = Qt.binding(() => indexOfValue(store.keycardState))
onActivated: driver.keycardState = currentValue
Component.onCompleted: currentIndex = Qt.binding(() => indexOfValue(driver.keycardState))
}
}
}
Expand Down
20 changes: 12 additions & 8 deletions storybook/pages/OnboardingLayoutPage.qml
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,7 @@ import QtQuick.Controls 2.15
import QtQuick.Layouts 1.15
import QtQuick.Window 2.15

import StatusQ 0.1
import StatusQ.Core.Theme 0.1
import StatusQ.Core 0.1
import StatusQ.Controls 0.1
import StatusQ.Components 0.1
import Qt.labs.settings 1.0

import AppLayouts.Onboarding.enums 1.0
import AppLayouts.Onboarding2 1.0
Expand Down Expand Up @@ -379,9 +375,11 @@ SplitView {
const stack = onboarding.stack
let content = `Stack (${stack.depth}):`

for (let i = 0; i < stack.depth; i++)
content += " " + InspectionUtils.baseName(
stack.get(i, StackView.ForceLoad))
for (let i = 0; i < stack.depth; i++) {
const stackEntry = stack.get(i, StackView.ForceLoad)
content += " " + InspectionUtils.baseName(stackEntry instanceof Loader
? stackEntry.item : stackEntry)
}

return content
}
Expand Down Expand Up @@ -526,6 +524,12 @@ SplitView {
}
}
}

Settings {
property alias useBiometrics: ctrlBiometrics.checked
property alias showLoginScreen: ctrlLoginScreen.checked
property alias useTouchId: ctrlTouchIdUser.checked
}
}

// category: Onboarding
Expand Down
5 changes: 5 additions & 0 deletions storybook/qmlTests/tests/tst_OnboardingLayout.qml
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,11 @@ Item {
verify(!!stack)
tryCompare(stack, "busy", false) // wait for page transitions to stop

if (stack.currentItem instanceof Loader) {
verify(stack.currentItem.item instanceof pageClass)
return stack.currentItem.item
}

verify(stack.currentItem instanceof pageClass)
return stack.currentItem
}
Expand Down
72 changes: 68 additions & 4 deletions ui/app/AppLayouts/Onboarding2/OnboardingFlow.qml
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import QtQuick 2.15
import QtQuick.Controls 2.15
import QtQml 2.15

import StatusQ 0.1
import StatusQ.Popups 0.1
import StatusQ.Core.Utils 0.1 as SQUtils

Expand All @@ -12,13 +14,17 @@ SQUtils.QObject {

required property StackView stackView

required property var loginAccountsModel

required property int keycardState
required property int addKeyPairState
required property int syncState
required property var seedWords
required property int remainingPinAttempts
required property int remainingPukAttempts

required property bool isBiometricsLogin // FIXME should come from the loginAccountsModel for each profile separately?

required property bool biometricsAvailable
required property bool displayKeycardPromoBanner
required property bool networkChecksEnabled
Expand All @@ -32,6 +38,8 @@ SQUtils.QObject {
required property var tryToSetPinFunction
required property var tryToSetPukFunction

signal biometricsRequested
signal loginRequested(string keyUid, int method, var data)
signal keycardPinCreated(string pin)
signal keycardPinEntered(string pin)
signal enableBiometricsRequested(bool enable)
Expand All @@ -51,7 +59,7 @@ SQUtils.QObject {
signal finished(int flow)

function init() {
root.stackView.push(welcomePage)
root.stackView.push(entryPage)
}

function startCreateProfileFlow() {
Expand All @@ -66,10 +74,13 @@ SQUtils.QObject {
root.stackView.push(keycardLostPage)
}

readonly property LoginScreen loginScreen: d.loginScreen

QtObject {
id: d

property int flow
property LoginScreen loginScreen: null

function pushOrSkipBiometricsPage() {
if (root.biometricsAvailable) {
Expand All @@ -88,6 +99,15 @@ SQUtils.QObject {
}
}

Component {
id: entryPage

Loader {
sourceComponent: loginAccountsModel.ModelCount.empty ? welcomePage
: loginScreenComponent
}
}

Component {
id: welcomePage

Expand All @@ -109,6 +129,39 @@ SQUtils.QObject {
}
}

Component {
id: loginScreenComponent

LoginScreen {
id: loginScreen

keycardState: root.keycardState
tryToSetPinFunction: root.tryToSetPinFunction

keycardRemainingPinAttempts: root.remainingPinAttempts
keycardRemainingPukAttempts: root.remainingPukAttempts

loginAccountsModel: root.loginAccountsModel
biometricsAvailable: root.biometricsAvailable
isBiometricsLogin: root.isBiometricsLogin
onBiometricsRequested: root.biometricsRequested()
onLoginRequested: (keyUid, method, data) => root.loginRequested(keyUid, method, data)

onOnboardingCreateProfileFlowRequested: root.startCreateProfileFlow()
onOnboardingLoginFlowRequested: root.startLoginFlow()
onLostKeycard: root.startLostKeycardFlow()
onUnblockWithSeedphraseRequested: console.warn("!!! FIXME OnboardingLayout::onUnblockWithSeedphraseRequested")
onUnblockWithPukRequested: unblockWithPukFlow.init()
onKeycardFactoryResetRequested: console.warn("!!! FIXME OnboardingLayout::onKeycardFactoryResetRequested")

Binding {
target: d
restoreMode: Binding.RestoreValue
property: "loginScreen"
value: loginScreen
}
}
}

Component {
id: helpUsImproveStatusPage
Expand Down Expand Up @@ -279,6 +332,8 @@ SQUtils.QObject {
UnblockWithPukFlow {
id: unblockWithPukFlow

property string pin

stackView: root.stackView
keycardState: root.keycardState
tryToSetPukFunction: root.tryToSetPukFunction
Expand All @@ -287,12 +342,21 @@ SQUtils.QObject {
keycardPinInfoPageDelay: root.keycardPinInfoPageDelay

onReloadKeycardRequested: root.reloadKeycardRequested()
onKeycardPinCreated: (pin) => root.keycardPinCreated(pin)
onKeycardPinCreated: (pin) => {
unblockWithPukFlow.pin = pin
root.keycardPinCreated(pin)
}
onKeycardFactoryResetRequested: root.keycardFactoryResetRequested()

onFinished: {
d.flow = Onboarding.SecondaryFlow.LoginWithKeycard
d.pushOrSkipBiometricsPage()
if (root.loginScreen) {
root.loginRequested(root.loginScreen.selectedProfileKeyId,
Onboarding.LoginMethod.Keycard, { pin })
d.selectedProfileKeyId = ""
} else {
d.flow = Onboarding.SecondaryFlow.LoginWithKeycard
d.pushOrSkipBiometricsPage()
}
}
}

Expand Down
Loading

0 comments on commit 6914cc7

Please sign in to comment.