[fractal/fractal-next] event-actions: Implement remove message action
- From: Julian Sparber <jsparber src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [fractal/fractal-next] event-actions: Implement remove message action
- Date: Wed, 9 Feb 2022 17:36:42 +0000 (UTC)
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]