From 5753ca3a64090469feb8d99de9b2cf6baffeeeca Mon Sep 17 00:00:00 2001 From: Jorge Martin Espinosa Date: Mon, 7 Apr 2025 17:53:44 +0200 Subject: [PATCH] misc(ffi): add `thread_id` to `NotificationItem` (#4895) This is needed to identify the event as being in a thread, and to reply to it inside the thread instead of in the room's timeline. - [ ] Public API changes documented in changelogs (optional) Signed-off-by: --- .../matrix-sdk-ui/src/notification_client.rs | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/crates/matrix-sdk-ui/src/notification_client.rs b/crates/matrix-sdk-ui/src/notification_client.rs index 6d27f55a7..abb0b5b95 100644 --- a/crates/matrix-sdk-ui/src/notification_client.rs +++ b/crates/matrix-sdk-ui/src/notification_client.rs @@ -29,10 +29,11 @@ use ruma::{ events::{ room::{ member::{MembershipState, StrippedRoomMemberEvent}, - message::SyncRoomMessageEvent, + message::{Relation, SyncRoomMessageEvent}, }, - AnyFullStateEventContent, AnyStateEvent, AnySyncMessageLikeEvent, AnySyncTimelineEvent, - FullStateEventContent, StateEventType, TimelineEventType, + AnyFullStateEventContent, AnyMessageLikeEventContent, AnyStateEvent, + AnySyncMessageLikeEvent, AnySyncTimelineEvent, FullStateEventContent, StateEventType, + TimelineEventType, }, html::RemoveReplyFallback, push::Action, @@ -668,6 +669,7 @@ pub struct NotificationItem { /// It is set if and only if the push actions could be determined. pub is_noisy: Option, pub has_mention: Option, + pub thread_id: Option, } impl NotificationItem { @@ -735,6 +737,18 @@ impl NotificationItem { let is_noisy = push_actions.map(|actions| actions.iter().any(|a| a.sound().is_some())); let has_mention = push_actions.map(|actions| actions.iter().any(|a| a.is_highlight())); + let thread_id = 'thread_id: { + if let NotificationEvent::Timeline(AnySyncTimelineEvent::MessageLike(event)) = &event { + let content = event.original_content(); + if let Some(AnyMessageLikeEventContent::RoomMessage(content)) = content { + if let Some(Relation::Thread(thread)) = content.relates_to { + break 'thread_id Some(thread.event_id.to_string()); + } + } + }; + None + }; + let item = NotificationItem { event, raw_event, @@ -753,6 +767,7 @@ impl NotificationItem { joined_members_count: room.joined_members_count(), is_noisy, has_mention, + thread_id, }; Ok(item)