1414
1515use matrix_sdk:: { Client , Room , latest_events:: LocalLatestEventValue } ;
1616use matrix_sdk_base:: latest_event:: LatestEventValue as BaseLatestEventValue ;
17- use ruma:: {
18- MilliSecondsSinceUnixEpoch , OwnedUserId ,
19- events:: {
20- AnyMessageLikeEventContent , relation:: Replacement , room:: message:: RoomMessageEventContent ,
21- } ,
22- } ;
17+ use ruma:: { MilliSecondsSinceUnixEpoch , OwnedUserId } ;
2318use tracing:: trace;
2419
2520use crate :: timeline:: {
26- Profile , TimelineDetails , TimelineItemContent ,
27- event_handler:: { HandleAggregationKind , TimelineAction } ,
28- traits:: RoomDataProvider ,
21+ Profile , TimelineDetails , TimelineItemContent , event_handler:: TimelineAction ,
2922} ;
3023
3124/// A simplified version of [`matrix_sdk_base::latest_event::LatestEventValue`]
@@ -111,77 +104,17 @@ impl LatestEventValue {
111104 } ;
112105 let is_own = client. user_id ( ) . map ( |user_id| user_id == sender) . unwrap_or ( false ) ;
113106
114- let raw_any_sync_timeline_event = timeline_event. into_raw ( ) ;
115- let Ok ( any_sync_timeline_event) = raw_any_sync_timeline_event. deserialize ( ) else {
116- return Self :: None ;
117- } ;
118- let profile = room
119- . profile_from_user_id ( & sender)
120- . await
121- . map ( TimelineDetails :: Ready )
122- . unwrap_or ( TimelineDetails :: Unavailable ) ;
123-
124- match TimelineAction :: from_event (
125- any_sync_timeline_event,
126- & raw_any_sync_timeline_event,
127- room,
128- None ,
129- None ,
130- None ,
131- None ,
132- )
133- . await
134- {
135- // Easy path: no aggregation, direct event.
136- Some ( TimelineAction :: AddItem { content } ) => {
137- Self :: Remote { timestamp, sender, is_own, profile, content }
138- }
139-
140- // Aggregated event.
141- //
142- // Only edits are supported for the moment.
143- Some ( TimelineAction :: HandleAggregation {
144- kind :
145- HandleAggregationKind :: Edit { replacement : Replacement { new_content, .. } } ,
146- ..
147- } ) => {
148- // Let's map the edit into a regular message.
149- match TimelineAction :: from_content (
150- AnyMessageLikeEventContent :: RoomMessage ( RoomMessageEventContent :: new (
151- new_content. msgtype ,
152- ) ) ,
153- // We don't care about the `InReplyToDetails` in the context of a
154- // `LatestEventValue`.
155- None ,
156- // We don't care about the thread information in the context of a
157- // `LatestEventValue`.
158- None ,
159- None ,
160- ) {
161- // The expected case.
162- TimelineAction :: AddItem { content } => {
163- Self :: Remote { timestamp, sender, is_own, profile, content }
164- }
165-
166- // Supposedly unreachable, but let's pretend there is no
167- // `LatestEventValue` if it happens.
168- _ => {
169- trace ! ( "latest event was an edit that failed to be un-aggregated" ) ;
170-
171- Self :: None
172- }
173- }
174- }
107+ let profile =
108+ TimelineDetails :: from_initial_value ( Profile :: load ( room, & sender) . await ) ;
175109
176- _ => Self :: None ,
110+ match TimelineItemContent :: from_event ( room, timeline_event) . await {
111+ Some ( content) => Self :: Remote { timestamp, sender, is_own, profile, content } ,
112+ None => Self :: None ,
177113 }
178114 }
179115 BaseLatestEventValue :: RemoteInvite { timestamp, inviter, .. } => {
180116 let inviter_profile = if let Some ( inviter_id) = & inviter {
181- room. profile_from_user_id ( inviter_id)
182- . await
183- . map ( TimelineDetails :: Ready )
184- . unwrap_or ( TimelineDetails :: Unavailable )
117+ TimelineDetails :: from_initial_value ( Profile :: load ( room, inviter_id) . await )
185118 } else {
186119 TimelineDetails :: Unavailable
187120 } ;
@@ -199,11 +132,8 @@ impl LatestEventValue {
199132
200133 let sender =
201134 client. user_id ( ) . expect ( "The `Client` is supposed to be logged" ) . to_owned ( ) ;
202- let profile = room
203- . profile_from_user_id ( & sender)
204- . await
205- . map ( TimelineDetails :: Ready )
206- . unwrap_or ( TimelineDetails :: Unavailable ) ;
135+ let profile =
136+ TimelineDetails :: from_initial_value ( Profile :: load ( room, & sender) . await ) ;
207137
208138 match TimelineAction :: from_content ( message_like_event_content, None , None , None ) {
209139 TimelineAction :: AddItem { content } => Self :: Local {
0 commit comments