diff --git a/crates/matrix-sdk/src/widget/matrix.rs b/crates/matrix-sdk/src/widget/matrix.rs index 96a40d423aa..d8f4bb3e58a 100644 --- a/crates/matrix-sdk/src/widget/matrix.rs +++ b/crates/matrix-sdk/src/widget/matrix.rs @@ -26,8 +26,9 @@ use ruma::{ }, assign, events::{ - AnyMessageLikeEventContent, AnyStateEventContent, AnySyncTimelineEvent, AnyTimelineEvent, - MessageLikeEventType, StateEventType, TimelineEventType, + AnyMessageLikeEventContent, AnyStateEventContent, AnySyncMessageLikeEvent, + AnySyncStateEvent, AnySyncTimelineEvent, AnyTimelineEvent, MessageLikeEventType, + StateEventType, TimelineEventType, }, serde::Raw, RoomId, TransactionId, @@ -164,13 +165,31 @@ impl MatrixDriver { pub(crate) fn events(&self) -> EventReceiver { let (tx, rx) = unbounded_channel(); let room_id = self.room.room_id().to_owned(); - let handle = self.room.add_event_handler(move |raw: Raw| { - let _ = tx.send(attach_room_id(&raw, &room_id)); + + // Get only message like events from the timeline section of the sync. + let _tx = tx.clone(); + let _room_id = room_id.clone(); + let handle_msg_like = + self.room.add_event_handler(move |raw: Raw| { + let _ = _tx.send(attach_room_id(raw.cast_ref(), &_room_id)); + async {} + }); + let drop_guard_msg_like = self.room.client().event_handler_drop_guard(handle_msg_like); + + // Get only all state events from the state section of the sync. + let handle_state = self.room.add_event_handler(move |raw: Raw| { + let _ = tx.send(attach_room_id(raw.cast_ref(), &room_id)); async {} }); - - let drop_guard = self.room.client().event_handler_drop_guard(handle); - EventReceiver { rx, _drop_guard: drop_guard } + let drop_guard_state = self.room.client().event_handler_drop_guard(handle_state); + + // The receiver will get a combination of state and message like events. + // The state events will come from the state section of the sync (to always + // represent current resolved state). All state events in the timeline + // section of the sync will not be forwarded to the widget. + // TODO annotate the events and send both timeline and state section state + // events. + EventReceiver { rx, _drop_guards: [drop_guard_msg_like, drop_guard_state] } } } @@ -178,7 +197,7 @@ impl MatrixDriver { /// along with the drop guard for the room event handler. pub(crate) struct EventReceiver { rx: UnboundedReceiver>, - _drop_guard: EventHandlerDropGuard, + _drop_guards: [EventHandlerDropGuard; 2], } impl EventReceiver {