Files
neochat/src/settings/ThreePIdCard.qml

226 lines
9.9 KiB
QML

// SPDX-FileCopyrightText: 2024 James Graham <james.h.graham@protonmail.com>
// SPDX-License-Identifier: GPL-2.0-or-later
import QtQuick
import QtQuick.Controls as QQC2
import QtQuick.Layouts
import org.kde.kirigami as Kirigami
import org.kde.kirigamiaddons.formcard as FormCard
import org.kde.kitemmodels
import org.kde.neochat
ColumnLayout {
id: root
required property NeoChatConnection connection
required property string title
required property string medium
FormCard.FormHeader {
title: root.title
}
FormCard.FormCard {
id: devicesCard
Repeater {
id: deviceRepeater
model: KSortFilterProxyModel {
sourceModel: ThreePIdModel {
id: threePIdModel
connection: root.connection
}
filterRoleName: "medium"
filterString: root.medium
}
delegate: FormCard.AbstractFormDelegate {
id: threePIdDelegate
required property string address
required property string medium
required property bool isBound
contentItem: ColumnLayout {
RowLayout {
QQC2.Label {
Layout.fillWidth: true
text: threePIdDelegate.address
textFormat: Text.PlainText
elide: Text.ElideRight
wrapMode: Text.Wrap
maximumLineCount: 2
color: Kirigami.Theme.textColor
}
QQC2.ToolButton {
visible: root.connection.hasIdentityServer && threePIdDelegate.isBound
text: i18nc("@action:button", "Hide")
icon.name: "hide_table_row"
onClicked: threePIdBindHelper.unbind3PId(threePIdDelegate.address, threePIdDelegate.medium)
}
QQC2.ToolButton {
visible: threePIdBindHelper.bindStatus === ThreePIdBindHelper.Ready && root.connection.hasIdentityServer && !threePIdDelegate.isBound
text: i18nc("@action:button", "Share")
icon.name: "send-to-symbolic"
onClicked: threePIdBindHelper.bindStatus === ThreePIdBindHelper.Verification ? threePIdBindHelper.finalizeNewIdBind() : threePIdBindHelper.initiateNewIdBind()
}
QQC2.ToolButton {
text: i18nc("@action:button", "Remove")
icon.name: "edit-delete-remove"
onClicked: threePIdAddHelper.remove3PId(threePIdDelegate.address, threePIdDelegate.medium)
}
}
Kirigami.InlineMessage {
id: errorHandler
visible: threePIdBindHelper.bindStatusString.length > 0
Layout.topMargin: visible ? Kirigami.Units.smallSpacing : 0
Layout.fillWidth: true
text: threePIdBindHelper.bindStatusString
type: threePIdBindHelper.statusType
}
RowLayout {
visible: threePIdBindHelper.bindStatus !== ThreePIdBindHelper.Ready && threePIdBindHelper.bindStatus !== ThreePIdBindHelper.Success
Item {
Layout.fillWidth: true
}
QQC2.ToolButton {
text: i18nc("@action:button", "Complete")
icon.name: "answer-correct"
onClicked: threePIdBindHelper.finalizeNewIdBind()
}
QQC2.ToolButton {
text: i18nc("@action:button", "Cancel")
icon.name: "edit-delete-remove"
onClicked: threePIdBindHelper.cancel()
}
}
}
ThreePIdBindHelper {
id: threePIdBindHelper
readonly property int statusType: switch(bindStatus) {
case ThreePIdBindHelper.Invalid:
case ThreePIdBindHelper.AuthFailure:
return Kirigami.MessageType.Error;
case ThreePIdBindHelper.VerificationFailure:
return Kirigami.MessageType.Warning;
default:
return Kirigami.MessageType.Information;
}
connection: root.connection
newId: threePIdDelegate.address
medium: threePIdDelegate.medium
onThreePIdBound: threePIdModel.refreshModel()
onThreePIdUnbound: threePIdModel.refreshModel()
}
}
FormCard.FormTextDelegate {
required property string address
text: address
}
}
FormCard.FormTextFieldDelegate {
id: newCountryCode
visible: root.medium === "msisdn"
readOnly: threePIdAddHelper.newIdStatus == ThreePIdAddHelper.Verification ||
threePIdAddHelper.newIdStatus == ThreePIdAddHelper.Authentication ||
threePIdAddHelper.newIdStatus == ThreePIdAddHelper.AuthFailure ||
threePIdAddHelper.newIdStatus == ThreePIdAddHelper.VerificationFailure
label: i18nc("@label:textbox", "Country Code for new phone number")
Connections {
target: threePIdModel
function onModelReset(): void {
newCountryCode.text = ""
}
}
}
FormCard.FormTextFieldDelegate {
id: newId
readOnly: threePIdAddHelper.newIdStatus == ThreePIdAddHelper.Verification ||
threePIdAddHelper.newIdStatus == ThreePIdAddHelper.Authentication ||
threePIdAddHelper.newIdStatus == ThreePIdAddHelper.AuthFailure ||
threePIdAddHelper.newIdStatus == ThreePIdAddHelper.VerificationFailure
label: root.medium === "email" ? i18nc("@label:textbox", "New Email Address:") : i18nc("@label:textbox", "New Phone Number:")
statusMessage: switch(threePIdAddHelper.newIdStatus) {
case ThreePIdAddHelper.Verification:
return i18n("%1. Please follow the instructions there and then click the button below", root.medium == "email" ? i18n("We've sent you an email") : i18n("We've sent you a text message"));
case ThreePIdAddHelper.Invalid:
return root.medium == "email" ? i18n("The entered email is not valid") : i18n("The entered phone number is not valid");
case ThreePIdAddHelper.AuthFailure:
return i18n("Incorrect password entered");
case ThreePIdAddHelper.VerificationFailure:
return root.medium == "email" ? i18n("The email has not been verified. Please go to the email and follow the instructions there and then click the button below") : i18n("The phone number has not been verified. Please go to the text message and follow the instructions there and then click the button below");
default:
return "";
}
status: switch(threePIdAddHelper.newIdStatus) {
case ThreePIdAddHelper.Invalid:
case ThreePIdAddHelper.AuthFailure:
return Kirigami.MessageType.Error;
case ThreePIdAddHelper.VerificationFailure:
return Kirigami.MessageType.Warning;
default:
return Kirigami.MessageType.Information;
}
onAccepted: _private.openPasswordSheet()
Connections {
target: threePIdModel
function onModelReset(): void {
newId.text = ""
}
}
}
FormCard.FormDelegateSeparator {}
FormCard.FormButtonDelegate {
icon.name: threePIdAddHelper.newIdStatus == ThreePIdAddHelper.Ready ? "list-add-symbolic" : ""
text: threePIdAddHelper.newIdStatus == ThreePIdAddHelper.Ready ? i18nc("@action:button Add new email or phone number", "Add") : i18nc("@action:button", "Continue")
onClicked: _private.openPasswordSheet()
}
FormCard.FormButtonDelegate {
visible: threePIdAddHelper.newIdStatus == ThreePIdAddHelper.Verification ||
threePIdAddHelper.newIdStatus == ThreePIdAddHelper.Authentication ||
threePIdAddHelper.newIdStatus == ThreePIdAddHelper.AuthFailure ||
threePIdAddHelper.newIdStatus == ThreePIdAddHelper.VerificationFailure
text: i18nc("@action:button As in 'go back'", "Back")
onClicked: threePIdAddHelper.back()
}
}
ThreePIdAddHelper {
id: threePIdAddHelper
connection: root.connection
medium: root.medium
newId: newId.text
onThreePIdAdded: threePIdModel.refreshModel()
onThreePIdRemoved: threePIdModel.refreshModel()
onThreePIdUnbound: threePIdModel.refreshModel()
}
QtObject {
id: _private
function openPasswordSheet() {
if (threePIdAddHelper.newIdStatus == ThreePIdAddHelper.Ready) {
threePIdAddHelper.initiateNewIdAdd();
} else {
let dialog = Qt.createComponent('org.kde.neochat.settings', 'PasswordSheet').createObject(root, {});
dialog.submitPassword.connect(password => threePIdAddHelper.finalizeNewIdAdd(password));
dialog.open();
}
}
}
}