From 5cb013838b0ebaf10d7bfbcad026b4ae2e1fd4e7 Mon Sep 17 00:00:00 2001 From: miruka Date: Fri, 3 Apr 2020 06:13:45 -0400 Subject: [PATCH] Be able to redact our other account's events --- src/gui/Pages/Chat/Timeline/EventDelegate.qml | 8 +++-- src/gui/Pages/Chat/Timeline/EventList.qml | 13 +++++--- src/gui/Popups/RedactPopup.qml | 32 +++++++++++++------ src/gui/UI.qml | 10 ++++++ 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/gui/Pages/Chat/Timeline/EventDelegate.qml b/src/gui/Pages/Chat/Timeline/EventDelegate.qml index b776ad7c..7528c220 100644 --- a/src/gui/Pages/Chat/Timeline/EventDelegate.qml +++ b/src/gui/Pages/Chat/Timeline/EventDelegate.qml @@ -222,14 +222,16 @@ HColumnLayout { HMenuItemPopupSpawner { icon.name: "remove-message" text: qsTr("Remove") - enabled: properties.eventIds.length + enabled: properties.eventSenderAndIds.length popup: "Popups/RedactPopup.qml" popupParent: chat properties: ({ - userId: chat.userId, + preferUserId: chat.userId, roomId: chat.roomId, - eventIds: events.map(ev => ev.event_id), + + eventSenderAndIds: + events.map(ev => [ev.sender_id, ev.event_id]), onlyOwnMessageWarning: ! chat.roomInfo.can_redact_all && diff --git a/src/gui/Pages/Chat/Timeline/EventList.qml b/src/gui/Pages/Chat/Timeline/EventList.qml index d0385cd9..fb782c7c 100644 --- a/src/gui/Pages/Chat/Timeline/EventList.qml +++ b/src/gui/Pages/Chat/Timeline/EventList.qml @@ -56,13 +56,16 @@ Rectangle { "Popups/RedactPopup.qml", chat, { - userId: chat.userId, + preferUserId: chat.userId, roomId: chat.roomId, - eventIds: + + eventSenderAndIds: (events || findLastRemovableDelegate()).map( - ev => ev.event_id, + ev => [ev.sender_id, ev.event_id], ), + isLast: ! events, + onlyOwnMessageWarning: ! chat.roomInfo.can_redact_all && events && @@ -84,7 +87,7 @@ Rectangle { for (let i = 0; i < eventList.model.count && i <= 1000; i++) { const event = eventList.model.get(i) if (eventList.canRedact(event) && - event.sender_id === chat.userId) return [event] + mainUI.accountIds.includes(event.sender_id)) return [event] } return [] } @@ -220,7 +223,7 @@ Rectangle { function canRedact(eventModel) { return eventModel.event_type !== "RedactedEvent" && (chat.roomInfo.can_redact_all || - eventModel.sender_id === chat.userId) + mainUI.accountIds.includes(eventModel.sender_id)) } function canCombine(item, itemAfter) { diff --git a/src/gui/Popups/RedactPopup.qml b/src/gui/Popups/RedactPopup.qml index 219633f8..657582bb 100644 --- a/src/gui/Popups/RedactPopup.qml +++ b/src/gui/Popups/RedactPopup.qml @@ -9,8 +9,8 @@ BoxPopup { isLast ? qsTr("Remove your last message?") : - eventIds.length > 1 ? - qsTr("Remove %1 messages?").arg(eventIds.length) : + eventSenderAndIds.length > 1 ? + qsTr("Remove %1 messages?").arg(eventSenderAndIds.length) : qsTr("Remove this message?") @@ -23,17 +23,31 @@ BoxPopup { okText: qsTr("Remove") box.focusButton: "ok" - onOk: py.callClientCoro( - userId, - "room_mass_redact", - [roomId, reasonField.field.text, ...eventIds] - ) + onOk: { + const idsForSender = {} // {senderId: [eventId, ...]} + + for (const [senderId, eventId] of eventSenderAndIds) { + if (! idsForSender[senderId]) + idsForSender[senderId] = [] + + idsForSender[senderId].push(eventId) + } + + print( JSON.stringify( idsForSender, null, 4)) + + for (const [senderId, eventIds] of Object.entries(idsForSender)) + py.callClientCoro( + mainUI.accountIds.includes(senderId) ? senderId : preferUserId, + "room_mass_redact", + [roomId, reasonField.field.text, ...eventIds] + ) + } + property string preferUserId: "" property string roomId: "" - property string userId: "" - property var eventIds: [] + property var eventSenderAndIds: [] // [[senderId, eventId], ...] property bool onlyOwnMessageWarning: false property bool isLast: false diff --git a/src/gui/UI.qml b/src/gui/UI.qml index b78cae3e..7a12388e 100644 --- a/src/gui/UI.qml +++ b/src/gui/UI.qml @@ -18,6 +18,16 @@ Item { property bool accountsPresent: ModelStore.get("accounts").count > 0 || py.startupAnyAccountsSaved + readonly property var accountIds: { + const ids = [] + const model = ModelStore.get("accounts") + + for (let i = 0; i < model.count; i++) + ids.push(model.get(i).id) + + return ids + } + readonly property alias debugConsole: debugConsole readonly property alias mainPane: mainPane readonly property alias pageLoader: pageLoader