moment/src/gui/Popups/InviteToRoomPopup.qml

148 lines
4.1 KiB
QML
Raw Normal View History

2019-12-19 22:46:16 +11:00
// SPDX-License-Identifier: LGPL-3.0-or-later
2019-12-12 03:42:59 +11:00
import QtQuick 2.12
2020-05-30 06:35:27 +10:00
import QtQuick.Controls 2.12
2019-12-12 03:42:59 +11:00
import QtQuick.Layouts 1.12
import "../Base"
import "../Base/Buttons"
2019-12-12 03:42:59 +11:00
HColumnPopup {
2019-12-12 03:42:59 +11:00
id: popup
property string userId
property string roomId
property string roomName
property bool invitingAllowed: true
2019-12-12 03:42:59 +11:00
property var inviteFuture: null
property var successfulInvites: []
property var failedInvites: []
2019-12-12 03:42:59 +11:00
function invite() {
inviteButton.loading = true
2019-12-12 03:42:59 +11:00
const inviteesLeft = inviteArea.text.trim().split(/\s+/).filter(
user => ! successfulInvites.includes(user)
)
2019-12-12 03:42:59 +11:00
inviteFuture = py.callClientCoro(
userId,
"room_mass_invite",
[roomId, ...inviteesLeft],
([successes, errors]) => {
if (errors.length < 1) {
popup.close()
return
2019-12-12 03:42:59 +11:00
}
successfulInvites = successes
failedInvites = errors
inviteButton.loading = false
}
)
}
2019-12-12 03:42:59 +11:00
page.footer: AutoDirectionLayout {
ApplyButton {
id: inviteButton
text: qsTr("Invite")
icon.name: "room-send-invite"
enabled: invitingAllowed && Boolean(inviteArea.text.trim())
onClicked: invite()
}
2019-12-12 03:42:59 +11:00
CancelButton {
id: cancelButton
onClicked: popup.close()
}
}
2019-12-12 03:42:59 +11:00
onOpened: inviteArea.forceActiveFocus()
onClosed: if (inviteFuture) inviteFuture.cancel()
onInvitingAllowedChanged:
if (! invitingAllowed && inviteFuture) inviteFuture.cancel()
SummaryLabel {
text: qsTr("Invite members to <i>%1</i>").arg(roomName)
textFormat: Text.StyledText
}
2019-12-12 03:42:59 +11:00
HScrollView {
clip: true
2019-12-12 03:42:59 +11:00
Layout.fillWidth: true
Layout.fillHeight: true
2020-05-30 06:35:27 +10:00
HTextArea {
id: inviteArea
focusItemOnTab: inviteButton.enabled ? inviteButton : cancelButton
2020-05-30 06:35:27 +10:00
placeholderText:
qsTr("User IDs (e.g. @bob:matrix.org @alice:localhost)")
}
2019-12-12 03:42:59 +11:00
}
HLabel {
id: errorMessage
visible: Layout.maximumHeight > 0
wrapMode: Text.Wrap
color: theme.colors.errorText
text:
invitingAllowed ?
allErrors :
2019-12-23 02:21:47 +11:00
qsTr("You do not have permission to invite members to this room")
2019-12-12 03:42:59 +11:00
Layout.maximumHeight: text ? implicitHeight : 0
Layout.fillWidth: true
readonly property string allErrors: {
// TODO: handle these: real user not found
const lines = []
2020-03-08 19:46:20 +11:00
for (const [user, error] of failedInvites) {
2019-12-12 03:42:59 +11:00
const type = py.getattr(
py.getattr(error, "__class__"), "__name__",
)
lines.push(
type === "InvalidUserId" ?
qsTr("%1 is not a valid user ID, expected format is " +
"@username:homeserver").arg(user) :
type === "UserFromOtherServerDisallowed" ?
qsTr("This room rejects users from other matrix " +
"servers, can't invite %1").arg(user) :
type === "MatrixNotFound" ?
qsTr("%1 not found, please verify the entered ID")
2019-12-12 03:42:59 +11:00
.arg(user) :
type === "MatrixBadGateway" ?
qsTr("Could not contact %1's server, " +
"please verify the entered ID").arg(user) :
2019-12-12 03:42:59 +11:00
type === "MatrixUnsupportedRoomVersion" ?
qsTr("%1's server does not support this room's version")
.arg(user) :
type === "MatrixForbidden" ?
qsTr("%1 is banned from this room")
.arg(user) :
qsTr("Unknown error while inviting %1: %2 - %3")
.arg(user).arg(type).arg(py.getattr(error, "args"))
)
}
return lines.join("\n\n")
}
Behavior on Layout.maximumHeight { HNumberAnimation {} }
}
}