[fractal/fractal-next] event-actions: Implement remove message action



commit b0f864720032aa7b58554baa2565963f231b9a2f
Author: Kirill Schmidt <kirill schmidt teckids org>
Date:   Mon Jan 24 11:40:21 2022 +0100

    event-actions: Implement remove message action
    
    reaction-list: Add function to remove all reactions
    event: Ensure that reactions are removed properly &
    Ensure that reactions cannot be added if an event
    was redacted

 src/session/room/event.rs         | 14 +++++++++++---
 src/session/room/event_actions.rs | 29 ++++++++++++++++++++++++++++-
 src/session/room/reaction_list.rs |  9 +++++++++
 3 files changed, 48 insertions(+), 4 deletions(-)
---
diff --git a/src/session/room/event.rs b/src/session/room/event.rs
index 1def5242b..0e1234755 100644
--- a/src/session/room/event.rs
+++ b/src/session/room/event.rs
@@ -478,7 +478,11 @@ impl Event {
     }
 
     pub fn prepend_replacing_events(&self, events: Vec<Event>) {
-        self.imp().replacing_events.borrow_mut().splice(..0, events);
+        let priv_ = self.imp();
+        priv_.replacing_events.borrow_mut().splice(..0, events);
+        if self.redacted() {
+            priv_.reactions.clear();
+        }
     }
 
     pub fn append_replacing_events(&self, events: Vec<Event>) {
@@ -508,7 +512,9 @@ impl Event {
                         }),
                     )));
             }
-
+            if self.redacted() {
+                priv_.reactions.clear();
+            }
             self.notify("source");
         }
     }
@@ -558,7 +564,9 @@ impl Event {
 
     /// Add reactions to this event.
     pub fn add_reactions(&self, reactions: Vec<Event>) {
-        self.imp().reactions.add_reactions(reactions);
+        if !self.redacted() {
+            self.imp().reactions.add_reactions(reactions);
+        }
     }
 
     /// The content of this matrix event.
diff --git a/src/session/room/event_actions.rs b/src/session/room/event_actions.rs
index ef1357765..32e275789 100644
--- a/src/session/room/event_actions.rs
+++ b/src/session/room/event_actions.rs
@@ -5,7 +5,11 @@ use matrix_sdk::ruma::events::{room::message::MessageType, AnyMessageEventConten
 use once_cell::sync::Lazy;
 
 use crate::{
-    session::{event_source_dialog::EventSourceDialog, room::Event},
+    session::{
+        event_source_dialog::EventSourceDialog,
+        room::{Event, RoomAction},
+        user::UserExt,
+    },
     spawn,
     utils::cache_dir,
     Error, UserFacingError, Window,
@@ -86,6 +90,29 @@ where
         );
 
         if let Some(AnyMessageEventContent::RoomMessage(message)) = event.message_content() {
+            let user_id = event
+                .room()
+                .session()
+                .user()
+                .map(|user| user.user_id())
+                .unwrap();
+            let user = event.room().members().member_by_id(user_id);
+            if event.sender() == user
+                || event
+                    .room()
+                    .power_levels()
+                    .min_level_for_room_action(&RoomAction::Redact)
+                    <= user.power_level()
+            {
+                // Remove message
+                gtk_macros::action!(
+                    &action_group,
+                    "remove",
+                    clone!(@weak event, => move |_, _| {
+                        event.room().redact(event.matrix_event_id(), None);
+                    })
+                );
+            }
             // Send/redact a reaction
             gtk_macros::action!(
                 &action_group,
diff --git a/src/session/room/reaction_list.rs b/src/session/room/reaction_list.rs
index bff36dd9e..7968ced97 100644
--- a/src/session/room/reaction_list.rs
+++ b/src/session/room/reaction_list.rs
@@ -125,6 +125,15 @@ impl ReactionList {
             .unwrap();
         self.items_changed(pos as u32, 1, 0);
     }
+
+    /// Removes all reactions.
+    pub fn clear(&self) {
+        let mut reactions = self.imp().reactions.borrow_mut();
+        let len = reactions.len();
+        reactions.clear();
+        std::mem::drop(reactions);
+        self.items_changed(0, len as u32, 0);
+    }
 }
 
 impl Default for ReactionList {


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]