Skip to content

Commit 7aa930b

Browse files
authored
feat(WidgetDriver): Send state from state sync and not from timeline to widget (#4254)
1 parent c02d8ce commit 7aa930b

File tree

1 file changed

+27
-8
lines changed

1 file changed

+27
-8
lines changed

crates/matrix-sdk/src/widget/matrix.rs

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,9 @@ use ruma::{
2626
},
2727
assign,
2828
events::{
29-
AnyMessageLikeEventContent, AnyStateEventContent, AnySyncTimelineEvent, AnyTimelineEvent,
30-
MessageLikeEventType, StateEventType, TimelineEventType,
29+
AnyMessageLikeEventContent, AnyStateEventContent, AnySyncMessageLikeEvent,
30+
AnySyncStateEvent, AnySyncTimelineEvent, AnyTimelineEvent, MessageLikeEventType,
31+
StateEventType, TimelineEventType,
3132
},
3233
serde::{from_raw_json_value, Raw},
3334
EventId, RoomId, TransactionId,
@@ -177,21 +178,39 @@ impl MatrixDriver {
177178
pub(crate) fn events(&self) -> EventReceiver {
178179
let (tx, rx) = unbounded_channel();
179180
let room_id = self.room.room_id().to_owned();
180-
let handle = self.room.add_event_handler(move |raw: Raw<AnySyncTimelineEvent>| {
181-
let _ = tx.send(attach_room_id(&raw, &room_id));
181+
182+
// Get only message like events from the timeline section of the sync.
183+
let _tx = tx.clone();
184+
let _room_id = room_id.clone();
185+
let handle_msg_like =
186+
self.room.add_event_handler(move |raw: Raw<AnySyncMessageLikeEvent>| {
187+
let _ = _tx.send(attach_room_id(raw.cast_ref(), &_room_id));
188+
async {}
189+
});
190+
let drop_guard_msg_like = self.room.client().event_handler_drop_guard(handle_msg_like);
191+
192+
// Get only all state events from the state section of the sync.
193+
let handle_state = self.room.add_event_handler(move |raw: Raw<AnySyncStateEvent>| {
194+
let _ = tx.send(attach_room_id(raw.cast_ref(), &room_id));
182195
async {}
183196
});
184-
185-
let drop_guard = self.room.client().event_handler_drop_guard(handle);
186-
EventReceiver { rx, _drop_guard: drop_guard }
197+
let drop_guard_state = self.room.client().event_handler_drop_guard(handle_state);
198+
199+
// The receiver will get a combination of state and message like events.
200+
// The state events will come from the state section of the sync (to always
201+
// represent current resolved state). All state events in the timeline
202+
// section of the sync will not be forwarded to the widget.
203+
// TODO annotate the events and send both timeline and state section state
204+
// events.
205+
EventReceiver { rx, _drop_guards: [drop_guard_msg_like, drop_guard_state] }
187206
}
188207
}
189208

190209
/// A simple entity that wraps an `UnboundedReceiver`
191210
/// along with the drop guard for the room event handler.
192211
pub(crate) struct EventReceiver {
193212
rx: UnboundedReceiver<Raw<AnyTimelineEvent>>,
194-
_drop_guard: EventHandlerDropGuard,
213+
_drop_guards: [EventHandlerDropGuard; 2],
195214
}
196215

197216
impl EventReceiver {

0 commit comments

Comments
 (0)