moment/src/qml/Pages/AddAccount/SignIn.qml
2019-12-09 11:35:50 -04:00

204 lines
5.3 KiB
QML

import QtQuick 2.12
import QtQuick.Layouts 1.12
import "../../Base"
HBox {
id: signInBox
clickButtonOnEnter: "apply"
onFocusChanged: idField.forceActiveFocus()
buttonModel: [
{
name: "apply",
text: qsTr("Sign in"),
enabled: canSignIn,
iconName: "sign-in",
loading: loginFuture !== null,
disableWhileLoading: false,
},
{ name: "cancel", text: qsTr("Cancel"), iconName: "cancel"},
]
buttonCallbacks: ({
apply: button => {
if (loginFuture) loginFuture.cancel()
signInTimeout.restart()
errorMessage.text = ""
let args = [
idField.text, passwordField.text,
undefined, serverField.text,
]
loginFuture = py.callCoro("login_client", args, userId => {
signInTimeout.stop()
errorMessage.text = ""
loginFuture = null
py.callCoro(
rememberAccount.checked ?
"saved_accounts.add": "saved_accounts.delete",
[userId]
)
pageLoader.showPage(
"AccountSettings/AccountSettings", {userId}
)
}, type => {
if (type === "CancelledError") return
loginFuture = null
signInTimeout.stop()
let txt = qsTr("Invalid request or login type")
if (type === "MatrixForbidden")
txt = qsTr("Invalid username or password")
if (type === "MatrixUserDeactivated")
txt = qsTr("This account was deactivated")
errorMessage.text = txt
})
},
cancel: button => {
if (! loginFuture) return
signInTimeout.stop()
loginFuture.cancel()
loginFuture = null
}
})
property var loginFuture: null
property string signInWith: "username"
readonly property bool canSignIn:
serverField.text && idField.text && passwordField.text &&
! serverField.error
Timer {
id: signInTimeout
interval: 30 * 1000
onTriggered: {
errorMessage.text =
serverField.knownServerChosen ?
qsTr("This server seems unavailable. Verify your inter" +
"net connection or try again in a few minutes.") :
qsTr("This server seems unavailable. Verify the " +
"entered URL, your internet connection or try " +
"again in a few minutes.")
}
}
HRowLayout {
visible: false // TODO
spacing: theme.spacing * 1.25
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: theme.spacing
Layout.bottomMargin: Layout.topMargin
Repeater {
model: ["username", "email", "phone"]
HButton {
icon.name: modelData
circle: true
checked: signInWith === modelData
enabled: modelData === "username"
autoExclusive: true
onClicked: signInWith = modelData
}
}
}
HTextField {
id: idField
placeholderText: qsTr(
signInWith === "email" ? "Email" :
signInWith === "phone" ? "Phone" :
"Username"
)
Layout.fillWidth: true
}
HTextField {
id: passwordField
placeholderText: qsTr("Password")
echoMode: HTextField.Password
Layout.fillWidth: true
}
HTextField {
id: serverField
placeholderText: qsTr("Homeserver URL")
text: "https://matrix.org"
error: ! /.+:\/\/.+/.test(cleanText)
Layout.fillWidth: true
readonly property string cleanText: text.toLowerCase().trim()
// 2019-11-11 https://www.hello-matrix.net/public_servers.php
readonly property var knownServers: [
"https://matrix.org",
"https://chat.weho.st",
"https://tchncs.de",
"https://chat.privacytools.io",
"https://hackerspaces.be",
"https://matrix.allmende.io",
"https://feneas.org",
"https://junta.pl",
"https://perthchat.org",
"https://matrix.tedomum.net",
"https://converser.eu",
"https://ru-matrix.org",
"https://matrix.sibnsk.net",
"https://alternanet.fr",
]
readonly property bool knownServerChosen:
knownServers.includes(cleanText)
}
HCheckBox {
id: rememberAccount
checked: true
text: qsTr("Remember my account")
subtitle.text: qsTr(
"An access token will be stored on this device to " +
"automatically sign you in."
)
Layout.fillWidth: true
}
HLabel {
id: errorMessage
wrapMode: Text.Wrap
horizontalAlignment: Text.AlignHCenter
color: theme.colors.errorText
visible: Layout.maximumHeight > 0
Layout.maximumHeight: text ? implicitHeight : 0
Behavior on Layout.maximumHeight { HNumberAnimation {} }
Layout.fillWidth: true
}
}