fix(@desktop/login): crash on login and login ux improvements
This commit is contained in:
parent
b1be4d643b
commit
2df8e938ae
|
@ -44,10 +44,16 @@ proc mainProc() =
|
||||||
status.tasks.marathon.registerWorker(mailserverWorker)
|
status.tasks.marathon.registerWorker(mailserverWorker)
|
||||||
status.initNode()
|
status.initNode()
|
||||||
|
|
||||||
|
defer:
|
||||||
|
info "Status app is shutting down..."
|
||||||
|
status.tasks.teardown()
|
||||||
|
|
||||||
enableHDPI()
|
enableHDPI()
|
||||||
initializeOpenGL()
|
initializeOpenGL()
|
||||||
|
|
||||||
let app = newQGuiApplication()
|
let app = newQGuiApplication()
|
||||||
|
defer: app.delete()
|
||||||
|
|
||||||
let resources =
|
let resources =
|
||||||
if defined(windows) and defined(production):
|
if defined(windows) and defined(production):
|
||||||
"/../resources/resources.rcc"
|
"/../resources/resources.rcc"
|
||||||
|
@ -85,6 +91,7 @@ proc mainProc() =
|
||||||
let networkAccessFactory = newQNetworkAccessManagerFactory(TMPDIR & "netcache")
|
let networkAccessFactory = newQNetworkAccessManagerFactory(TMPDIR & "netcache")
|
||||||
|
|
||||||
let engine = newQQmlApplicationEngine()
|
let engine = newQQmlApplicationEngine()
|
||||||
|
defer: engine.delete()
|
||||||
engine.addImportPath("qrc:/./StatusQ/src")
|
engine.addImportPath("qrc:/./StatusQ/src")
|
||||||
engine.setNetworkAccessManagerFactory(networkAccessFactory)
|
engine.setNetworkAccessManagerFactory(networkAccessFactory)
|
||||||
app.installEventFilter(engine)
|
app.installEventFilter(engine)
|
||||||
|
@ -103,46 +110,56 @@ proc mainProc() =
|
||||||
netAccMgr.setNetworkAccessible(NetworkAccessibility.Accessible)
|
netAccMgr.setNetworkAccessible(NetworkAccessibility.Accessible)
|
||||||
|
|
||||||
let signalController = signals.newController(status)
|
let signalController = signals.newController(status)
|
||||||
|
defer: signalController.delete()
|
||||||
|
|
||||||
# We need this global variable in order to be able to access the application
|
# We need this global variable in order to be able to access the application
|
||||||
# from the non-closure callback passed to `libstatus.setSignalEventCallback`
|
# from the non-closure callback passed to `libstatus.setSignalEventCallback`
|
||||||
signalsQObjPointer = cast[pointer](signalController.vptr)
|
signalsQObjPointer = cast[pointer](signalController.vptr)
|
||||||
|
|
||||||
var wallet = wallet.newController(status)
|
var wallet = wallet.newController(status)
|
||||||
|
defer: wallet.delete()
|
||||||
engine.setRootContextProperty("walletModel", wallet.variant)
|
engine.setRootContextProperty("walletModel", wallet.variant)
|
||||||
|
|
||||||
var chat = chat.newController(status)
|
var chat = chat.newController(status)
|
||||||
|
defer: chat.delete()
|
||||||
engine.setRootContextProperty("chatsModel", chat.variant)
|
engine.setRootContextProperty("chatsModel", chat.variant)
|
||||||
|
|
||||||
var node = node.newController(status, netAccMgr)
|
var node = node.newController(status, netAccMgr)
|
||||||
|
defer: node.delete()
|
||||||
engine.setRootContextProperty("nodeModel", node.variant)
|
engine.setRootContextProperty("nodeModel", node.variant)
|
||||||
|
|
||||||
var utilsController = utilsView.newController(status)
|
var utilsController = utilsView.newController(status)
|
||||||
|
defer: utilsController.delete()
|
||||||
engine.setRootContextProperty("utilsModel", utilsController.variant)
|
engine.setRootContextProperty("utilsModel", utilsController.variant)
|
||||||
|
|
||||||
var browserController = browserView.newController(status)
|
var browserController = browserView.newController(status)
|
||||||
|
defer: browserController.delete()
|
||||||
engine.setRootContextProperty("browserModel", browserController.variant)
|
engine.setRootContextProperty("browserModel", browserController.variant)
|
||||||
|
|
||||||
proc changeLanguage(locale: string) =
|
proc changeLanguage(locale: string) =
|
||||||
engine.setTranslationPackage(joinPath(i18nPath, fmt"qml_{locale}.qm"))
|
engine.setTranslationPackage(joinPath(i18nPath, fmt"qml_{locale}.qm"))
|
||||||
|
|
||||||
var profile = profile.newController(status, changeLanguage)
|
var profile = profile.newController(status, changeLanguage)
|
||||||
|
defer: profile.delete()
|
||||||
engine.setRootContextProperty("profileModel", profile.variant)
|
engine.setRootContextProperty("profileModel", profile.variant)
|
||||||
|
|
||||||
var provider = provider.newController(status)
|
var provider = provider.newController(status)
|
||||||
|
defer: provider.delete()
|
||||||
engine.setRootContextProperty("web3Provider", provider.variant)
|
engine.setRootContextProperty("web3Provider", provider.variant)
|
||||||
|
|
||||||
var login = login.newController(status)
|
var login = login.newController(status)
|
||||||
|
defer: login.delete()
|
||||||
var onboarding = onboarding.newController(status)
|
var onboarding = onboarding.newController(status)
|
||||||
|
defer: onboarding.delete()
|
||||||
|
|
||||||
status.events.once("login") do(a: Args):
|
status.events.once("login") do(a: Args):
|
||||||
var args = AccountArgs(a)
|
var args = AccountArgs(a)
|
||||||
|
|
||||||
status.tasks.marathon.onLoggedIn()
|
status.tasks.marathon.onLoggedIn()
|
||||||
|
|
||||||
# Delete login and onboarding from memory to remove any mnemonic that would have been saved in the accounts list
|
# Reset login and onboarding to remove any mnemonic that would have been saved in the accounts list
|
||||||
login.delete()
|
login.reset()
|
||||||
onboarding.delete()
|
onboarding.reset()
|
||||||
|
|
||||||
status.startMessenger()
|
status.startMessenger()
|
||||||
profile.init(args.account)
|
profile.init(args.account)
|
||||||
|
@ -161,23 +178,7 @@ proc mainProc() =
|
||||||
let isExperimental = if getEnv("EXPERIMENTAL") == "1": "1" else: "0" # value explicity passed to avoid trusting input
|
let isExperimental = if getEnv("EXPERIMENTAL") == "1": "1" else: "0" # value explicity passed to avoid trusting input
|
||||||
let experimentalFlag = newQVariant(isExperimental)
|
let experimentalFlag = newQVariant(isExperimental)
|
||||||
engine.setRootContextProperty("isExperimental", experimentalFlag)
|
engine.setRootContextProperty("isExperimental", experimentalFlag)
|
||||||
|
|
||||||
defer:
|
|
||||||
error "TODO: if user is logged in, logout"
|
|
||||||
provider.delete()
|
|
||||||
engine.delete()
|
|
||||||
app.delete()
|
|
||||||
signalController.delete()
|
|
||||||
login.delete()
|
|
||||||
onboarding.delete()
|
|
||||||
wallet.delete()
|
|
||||||
chat.delete()
|
|
||||||
profile.delete()
|
|
||||||
utilsController.delete()
|
|
||||||
browserController.delete()
|
|
||||||
status.tasks.teardown()
|
|
||||||
|
|
||||||
|
|
||||||
# Initialize only controllers whose init functions
|
# Initialize only controllers whose init functions
|
||||||
# do not need a running node
|
# do not need a running node
|
||||||
proc initControllers() =
|
proc initControllers() =
|
||||||
|
|
10
ui/main.qml
10
ui/main.qml
|
@ -93,15 +93,15 @@ StatusWindow {
|
||||||
target: applicationWindow
|
target: applicationWindow
|
||||||
onClosing: {
|
onClosing: {
|
||||||
if (loader.sourceComponent == login) {
|
if (loader.sourceComponent == login) {
|
||||||
applicationWindow.visible = false;
|
applicationWindow.visible = false
|
||||||
close.accepted = false;
|
close.accepted = false
|
||||||
}
|
}
|
||||||
else if (loader.sourceComponent == app) {
|
else if (loader.sourceComponent == app) {
|
||||||
if (loader.item.appSettings.quitOnClose) {
|
if (loader.item.appSettings.quitOnClose) {
|
||||||
Qt.quit();
|
close.accepted = true
|
||||||
} else {
|
} else {
|
||||||
applicationWindow.visible = false;
|
applicationWindow.visible = false
|
||||||
close.accepted = false;
|
close.accepted = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,8 +128,9 @@ Item {
|
||||||
id: txtPassword
|
id: txtPassword
|
||||||
anchors.top: addressText.bottom
|
anchors.top: addressText.bottom
|
||||||
anchors.topMargin: Style.current.padding * 2
|
anchors.topMargin: Style.current.padding * 2
|
||||||
|
enabled: !loading
|
||||||
//% "Enter password"
|
//% "Enter password"
|
||||||
placeholderText: qsTrId("enter-password")
|
placeholderText: loading ? qsTr("Connecting...") : qsTrId("enter-password")
|
||||||
textField.echoMode: TextInput.Password
|
textField.echoMode: TextInput.Password
|
||||||
textField.focus: true
|
textField.focus: true
|
||||||
Keys.onReturnPressed: {
|
Keys.onReturnPressed: {
|
||||||
|
@ -140,6 +141,7 @@ Item {
|
||||||
loading = false
|
loading = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
StatusRoundButton {
|
StatusRoundButton {
|
||||||
id: submitBtn
|
id: submitBtn
|
||||||
size: "medium"
|
size: "medium"
|
||||||
|
@ -147,9 +149,9 @@ Item {
|
||||||
icon.name: "arrow-right"
|
icon.name: "arrow-right"
|
||||||
icon.width: 18
|
icon.width: 18
|
||||||
icon.height: 14
|
icon.height: 14
|
||||||
visible: txtPassword.text.length > 0
|
opacity: (loading || txtPassword.text.length > 0) ? 1 : 0
|
||||||
anchors.left: txtPassword.right
|
anchors.left: txtPassword.right
|
||||||
anchors.leftMargin: Style.current.padding
|
anchors.leftMargin: (loading || txtPassword.text.length > 0) ? Style.current.padding : Style.current.smallPadding
|
||||||
anchors.verticalCenter: txtPassword.verticalCenter
|
anchors.verticalCenter: txtPassword.verticalCenter
|
||||||
state: loading ? "pending" : "default"
|
state: loading ? "pending" : "default"
|
||||||
onClicked: {
|
onClicked: {
|
||||||
|
@ -159,6 +161,20 @@ Item {
|
||||||
setCurrentFlow(true);
|
setCurrentFlow(true);
|
||||||
loading = true
|
loading = true
|
||||||
loginModel.login(txtPassword.textField.text)
|
loginModel.login(txtPassword.textField.text)
|
||||||
|
txtPassword.textField.clear()
|
||||||
|
}
|
||||||
|
|
||||||
|
// https://www.figma.com/file/BTS422M9AkvWjfRrXED3WC/%F0%9F%91%8B-Onboarding%E2%8E%9CDesktop?node-id=6%3A0
|
||||||
|
Behavior on opacity {
|
||||||
|
OpacityAnimator {
|
||||||
|
from: 0.5
|
||||||
|
duration: 200
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Behavior on anchors.leftMargin {
|
||||||
|
NumberAnimation {
|
||||||
|
duration: 200
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -167,9 +183,15 @@ Item {
|
||||||
ignoreUnknownSignals: true
|
ignoreUnknownSignals: true
|
||||||
onLoginResponseChanged: {
|
onLoginResponseChanged: {
|
||||||
if (error) {
|
if (error) {
|
||||||
errMsg.visible = true;
|
// SQLITE_NOTADB: "file is not a database"
|
||||||
loading = false;
|
if (error === "file is not a database") {
|
||||||
|
errMsg.text = errMsg.incorrectPasswordMsg
|
||||||
|
} else {
|
||||||
|
errMsg.text = qsTr("Login failed: %1").arg(error.toUpperCase())
|
||||||
|
}
|
||||||
|
errMsg.visible = true
|
||||||
|
loading = false
|
||||||
|
txtPassword.textField.forceActiveFocus()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -191,12 +213,13 @@ Item {
|
||||||
|
|
||||||
StyledText {
|
StyledText {
|
||||||
id: errMsg
|
id: errMsg
|
||||||
|
//% "Login failed. Please re-enter your password and try again."
|
||||||
|
readonly property string incorrectPasswordMsg: qsTrId("login-failed--please-re-enter-your-password-and-try-again-")
|
||||||
anchors.top: generateKeysLinkText.bottom
|
anchors.top: generateKeysLinkText.bottom
|
||||||
anchors.topMargin: Style.current.smallPadding
|
anchors.topMargin: Style.current.smallPadding
|
||||||
anchors.horizontalCenter: parent.horizontalCenter
|
anchors.horizontalCenter: parent.horizontalCenter
|
||||||
visible: false
|
visible: false
|
||||||
//% "Login failed. Please re-enter your password and try again."
|
text: incorrectPasswordMsg
|
||||||
text: qsTrId("login-failed--please-re-enter-your-password-and-try-again-")
|
|
||||||
font.pixelSize: 13
|
font.pixelSize: 13
|
||||||
color: Style.current.danger
|
color: Style.current.danger
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue