diff --git a/src/neochatroom.cpp b/src/neochatroom.cpp index a4c767252..effebcec1 100644 --- a/src/neochatroom.cpp +++ b/src/neochatroom.cpp @@ -864,9 +864,9 @@ QString NeoChatRoom::htmlSafeDisplayName() const return displayName().toHtmlEscaped(); } -void NeoChatRoom::deleteMessagesByUser(const QString &user) +void NeoChatRoom::deleteMessagesByUser(const QString &user, const QString &reason) { - doDeleteMessagesByUser(user); + doDeleteMessagesByUser(user, reason); } QString NeoChatRoom::joinRule() const @@ -888,7 +888,7 @@ void NeoChatRoom::setJoinRule(const QString &joinRule) // Not emitting joinRuleChanged() here, since that would override the change in the UI with the *current* value, which is not the *new* value. } -QCoro::Task NeoChatRoom::doDeleteMessagesByUser(const QString &user) +QCoro::Task NeoChatRoom::doDeleteMessagesByUser(const QString &user, QString reason) { QStringList events; for (const auto &event : messageEvents()) { @@ -897,7 +897,7 @@ QCoro::Task NeoChatRoom::doDeleteMessagesByUser(const QString &user) } } for (const auto &e : events) { - auto job = connection()->callApi(id(), QUrl::toPercentEncoding(e), connection()->generateTxnId()); + auto job = connection()->callApi(id(), QUrl::toPercentEncoding(e), connection()->generateTxnId(), reason); co_await qCoro(job, &BaseJob::finished); if (job->error() != BaseJob::Success) { qWarning() << "Error: \"" << job->error() << "\" while deleting messages. Aborting"; diff --git a/src/neochatroom.h b/src/neochatroom.h index 0b755ec6f..b21cdfd08 100644 --- a/src/neochatroom.h +++ b/src/neochatroom.h @@ -221,7 +221,7 @@ private: void onAddHistoricalTimelineEvents(rev_iter_t from) override; void onRedaction(const Quotient::RoomEvent &prevEvent, const Quotient::RoomEvent &after) override; - QCoro::Task doDeleteMessagesByUser(const QString &user); + QCoro::Task doDeleteMessagesByUser(const QString &user, QString reason); QCoro::Task doUploadFile(QUrl url, QString body = QString()); QString m_chatBoxText; @@ -279,5 +279,5 @@ public Q_SLOTS: void addLocalAlias(const QString &alias); void removeLocalAlias(const QString &alias); void toggleReaction(const QString &eventId, const QString &reaction); - void deleteMessagesByUser(const QString &user); + void deleteMessagesByUser(const QString &user, const QString &reason); }; diff --git a/src/qml/Dialog/UserDetailDialog.qml b/src/qml/Dialog/UserDetailDialog.qml index a863ee096..88f2d2baa 100644 --- a/src/qml/Dialog/UserDetailDialog.qml +++ b/src/qml/Dialog/UserDetailDialog.qml @@ -134,11 +134,15 @@ Kirigami.OverlaySheet { visible: user === room.localUser || room.canSendState("redact") action: Kirigami.Action { - text: i18n("Delete recent messages by this user") + text: i18n("Remove recent messages by this user") icon.name: "delete" icon.color: Kirigami.Theme.negativeTextColor onTriggered: { - room.deleteMessagesByUser(user.id) + applicationWindow().pageStack.pushDialogLayer("qrc:/RemoveSheet.qml", {room: root.room, userId: user.id}, { + title: i18nc("@title", "Remove Messages"), + width: Kirigami.Units.gridUnit * 25 + }) + root.close() } } } diff --git a/src/qml/Menu/Timeline/FileDelegateContextMenu.qml b/src/qml/Menu/Timeline/FileDelegateContextMenu.qml index 00597c49d..3e97a05b4 100644 --- a/src/qml/Menu/Timeline/FileDelegateContextMenu.qml +++ b/src/qml/Menu/Timeline/FileDelegateContextMenu.qml @@ -60,10 +60,10 @@ MessageDelegateContextMenu { text: i18n("Remove") icon.name: "edit-delete-remove" icon.color: "red" - onTriggered: { - currentRoom.redactEvent(eventId); - root.closeFullscreen() - } + onTriggered: applicationWindow().pageStack.pushDialogLayer("qrc:/RemoveSheet.qml", {room: currentRoom, eventId: eventId}, { + title: i18nc("@title", "Remove Message"), + width: Kirigami.Units.gridUnit * 25 + }) }, Kirigami.Action { text: i18nc("@action:button 'Report' as in 'Report this event to the administrators'", "Report") diff --git a/src/qml/Menu/Timeline/MessageDelegateContextMenu.qml b/src/qml/Menu/Timeline/MessageDelegateContextMenu.qml index 75a1be3ca..8b4f2e973 100644 --- a/src/qml/Menu/Timeline/MessageDelegateContextMenu.qml +++ b/src/qml/Menu/Timeline/MessageDelegateContextMenu.qml @@ -46,7 +46,10 @@ Loader { text: i18n("Remove") icon.name: "edit-delete-remove" icon.color: "red" - onTriggered: currentRoom.redactEvent(eventId); + onTriggered: applicationWindow().pageStack.pushDialogLayer("qrc:/RemoveSheet.qml", {room: currentRoom, eventId: eventId}, { + title: i18nc("@title", "Remove Message"), + width: Kirigami.Units.gridUnit * 25 + }) }, Kirigami.Action { text: i18n("Copy") diff --git a/src/qml/Menu/Timeline/RemoveSheet.qml b/src/qml/Menu/Timeline/RemoveSheet.qml new file mode 100644 index 000000000..bcf199f9f --- /dev/null +++ b/src/qml/Menu/Timeline/RemoveSheet.qml @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2022 Tobias Fella +// SPDX-License-Identifier: GPL-2.0-or-later + +import QtQuick 2.15 +import QtQuick.Controls 2.15 as QQC2 +import QtQuick.Layouts 1.15 + +import org.kde.kirigami 2.20 as Kirigami + +Kirigami.Page { + id: deleteSheet + + property var room + property string eventId + + property string userId: "" + + title: userId.length > 0 ? i18n("Remove Messages") : i18n("Remove Message") + + QQC2.TextArea { + id: reason + placeholderText: userId.length > 0 ? i18n("Reason for removing this user's recent messages") : i18n("Reason for removing this message") + anchors.fill: parent + wrapMode: TextEdit.Wrap + } + + footer: QQC2.ToolBar { + QQC2.DialogButtonBox { + anchors.fill: parent + Item { + Layout.fillWidth: true + } + QQC2.Button { + text: i18nc("@action:button 'Remove' as in 'Remove this message'", "Remove") + icon.name: "delete" + QQC2.DialogButtonBox.buttonRole: QQC2.DialogButtonBox.AcceptRole + onClicked: { + if (deleteSheet.userId.length > 0) { + deleteSheet.room.deleteMessagesByUser(deleteSheet.userId, reason.text) + } else { + deleteSheet.room.redactEvent(deleteSheet.eventId, reason.text); + } + deleteSheet.closeDialog() + } + } + QQC2.Button { + text: i18nc("@action", "Cancel") + QQC2.DialogButtonBox.buttonRole: QQC2.DialogButtonBox.RejectRole + onClicked: deleteSheet.closeDialog() + } + } + } +} diff --git a/src/res.qrc b/src/res.qrc index 42ffa9737..d849d1154 100644 --- a/src/res.qrc +++ b/src/res.qrc @@ -91,5 +91,6 @@ qml/Settings/NetworkProxyPage.qml qml/Page/DevtoolsPage.qml qml/Dialog/ConfirmEncryptionDialog.qml + qml/Menu/Timeline/RemoveSheet.qml