Improve first-run UX
- Replace LoginPage with step-by-step approach to support different login flows - Implement login using SSO
This commit is contained in:
@@ -77,7 +77,7 @@ Kirigami.ScrollablePage {
|
||||
actions.main: Kirigami.Action {
|
||||
text: i18n("Add an account")
|
||||
iconName: "list-add-user"
|
||||
onTriggered: pageStack.layers.push("qrc:/imports/NeoChat/Page/LoginPage.qml")
|
||||
onTriggered: pageStack.layers.push("qrc:/imports/NeoChat/Page/WelcomePage.qml")
|
||||
}
|
||||
|
||||
Kirigami.OverlaySheet {
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2019 Black Hat <bhat@encom.eu.org>
|
||||
* SPDX-FileCopyrightText: 2020 Carl Schwan <carl@carlschwan.eu>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-3.0-only
|
||||
*/
|
||||
import QtQuick 2.12
|
||||
import QtQuick.Controls 2.12 as QQC2
|
||||
import QtQuick.Layouts 1.12
|
||||
|
||||
import org.kde.neochat 1.0
|
||||
|
||||
import NeoChat.Component 1.0
|
||||
|
||||
import org.kde.kirigami 2.12 as Kirigami
|
||||
|
||||
Kirigami.ScrollablePage {
|
||||
id: root
|
||||
|
||||
title: i18n("Login")
|
||||
|
||||
header: QQC2.Control {
|
||||
padding: Kirigami.Units.smallSpacing
|
||||
contentItem: Kirigami.InlineMessage {
|
||||
id: inlineMessage
|
||||
visible: false
|
||||
showCloseButton: true
|
||||
}
|
||||
}
|
||||
|
||||
Kirigami.FormLayout {
|
||||
id: formLayout
|
||||
QQC2.TextField {
|
||||
id: serverField
|
||||
Kirigami.FormData.label: i18n("Server Address")
|
||||
text: "https://matrix.org"
|
||||
onAccepted: usernameField.forceActiveFocus()
|
||||
}
|
||||
QQC2.TextField {
|
||||
id: usernameField
|
||||
Kirigami.FormData.label: i18n("Username")
|
||||
onAccepted: passwordField.forceActiveFocus()
|
||||
}
|
||||
Kirigami.PasswordField {
|
||||
id: passwordField
|
||||
Kirigami.FormData.label: i18n("Password")
|
||||
onAccepted: accessTokenField.forceActiveFocus()
|
||||
}
|
||||
QQC2.TextField {
|
||||
id: accessTokenField
|
||||
Kirigami.FormData.label: i18n("Access Token (Optional)")
|
||||
onAccepted: deviceNameField.forceActiveFocus()
|
||||
}
|
||||
QQC2.TextField {
|
||||
id: deviceNameField
|
||||
Kirigami.FormData.label: i18n("Device Name (Optional)")
|
||||
onAccepted: doLogin()
|
||||
}
|
||||
RowLayout {
|
||||
QQC2.Button {
|
||||
visible: Controller.accountCount > 0
|
||||
text: i18n("Cancel")
|
||||
onClicked: {
|
||||
pageStack.layers.clear();
|
||||
}
|
||||
}
|
||||
QQC2.Button {
|
||||
text: i18n("Login")
|
||||
onClicked: doLogin()
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: Controller
|
||||
function onErrorOccured(error, detail) {
|
||||
inlineMessage.type = Kirigami.MessageType.Error;
|
||||
if (detail && detail.length !== 0) {
|
||||
inlineMessage.text = i18n("%1: %2", error, detail);
|
||||
} else {
|
||||
inlineMessage.text = error;
|
||||
}
|
||||
inlineMessage.visible = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function doLogin() {
|
||||
inlineMessage.text = i18n("Loading, this might take up to 10 seconds.");
|
||||
inlineMessage.type = Kirigami.MessageType.Information
|
||||
inlineMessage.visible = true;
|
||||
if (accessTokenField.text.length > 0) {
|
||||
Controller.loginWithAccessToken(serverField.text.trim(), usernameField.text.trim(), accessTokenField.text, deviceNameField.text.trim());
|
||||
} else {
|
||||
Controller.loginWithCredentials(serverField.text.trim(), usernameField.text.trim(), passwordField.text, deviceNameField.text.trim());
|
||||
}
|
||||
}
|
||||
}
|
||||
101
imports/NeoChat/Page/WelcomePage.qml
Normal file
101
imports/NeoChat/Page/WelcomePage.qml
Normal file
@@ -0,0 +1,101 @@
|
||||
/**
|
||||
* SPDX-FileCopyrightText: 2020 Tobias Fella <fella@posteo.de>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
import QtQuick 2.14
|
||||
import QtQuick.Controls 2.14 as Controls
|
||||
import QtQuick.Layouts 1.14
|
||||
|
||||
import org.kde.kirigami 2.12 as Kirigami
|
||||
|
||||
import org.kde.neochat 1.0
|
||||
|
||||
import NeoChat.Component.Login 1.0
|
||||
|
||||
Kirigami.ScrollablePage {
|
||||
id: welcomePage
|
||||
|
||||
property alias currentStep: module.item
|
||||
|
||||
title: module.item.title ?? i18n("Welcome")
|
||||
|
||||
header: Controls.Control {
|
||||
contentItem: Kirigami.InlineMessage {
|
||||
id: headerMessage
|
||||
type: Kirigami.MessageType.Error
|
||||
showCloseButton: true
|
||||
visible: false
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: LoginHelper.init()
|
||||
|
||||
Connections {
|
||||
target: LoginHelper
|
||||
onErrorOccured: {
|
||||
headerMessage.text = message;
|
||||
headerMessage.visible = true;
|
||||
headerMessage.type = Kirigami.MessageType.Error;
|
||||
}
|
||||
}
|
||||
|
||||
ColumnLayout {
|
||||
Kirigami.Icon {
|
||||
source: "org.kde.neochat"
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: Kirigami.Units.gridUnit * 16
|
||||
}
|
||||
Controls.Label {
|
||||
Layout.fillWidth: true
|
||||
horizontalAlignment: Text.AlignHCenter
|
||||
font.pixelSize: 25
|
||||
text: module.item.message ?? module.item.title ?? i18n("Welcome to Matrix")
|
||||
}
|
||||
|
||||
Loader {
|
||||
id: module
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
source: "qrc:/imports/NeoChat/Component/Login/Login.qml"
|
||||
onSourceChanged: {
|
||||
headerMessage.visible = false
|
||||
headerMessage.text = ""
|
||||
}
|
||||
}
|
||||
RowLayout {
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
|
||||
Controls.Button {
|
||||
text: i18nc("@action:button", "Back")
|
||||
|
||||
enabled: welcomePage.currentStep.previousUrl !== ""
|
||||
visible: welcomePage.currentStep.showBackButton
|
||||
Layout.alignment: Qt.AlignHCenter
|
||||
onClicked: {
|
||||
module.source = welcomePage.currentStep.previousUrl
|
||||
}
|
||||
}
|
||||
|
||||
Controls.Button {
|
||||
id: continueButton
|
||||
enabled: welcomePage.currentStep.acceptable
|
||||
visible: welcomePage.currentStep.showContinueButton
|
||||
action: welcomePage.currentStep.action
|
||||
}
|
||||
}
|
||||
|
||||
Connections {
|
||||
target: currentStep
|
||||
|
||||
function onProcessed(nextUrl) {
|
||||
module.source = nextUrl;
|
||||
}
|
||||
function onShowMessage(message) {
|
||||
headerMessage.text = message;
|
||||
headerMessage.visible = true;
|
||||
headerMessage.type = Kirigami.MessageType.Information;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
module NeoChat.Page
|
||||
LoadingPage 1.0 LoadingPage.qml
|
||||
LoginPage 1.0 LoginPage.qml
|
||||
RoomListPage 1.0 RoomListPage.qml
|
||||
RoomPage 1.0 RoomPage.qml
|
||||
RoomWindow 1.0 RoomWindow.qml
|
||||
|
||||
Reference in New Issue
Block a user