226 lines
9.9 KiB
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();
|
|
}
|
|
}
|
|
}
|
|
}
|