@@ -16,9 +16,11 @@ use std::collections::{HashMap, HashSet};
16
16
17
17
use eyeball_im:: VectorDiff ;
18
18
use itertools:: Itertools as _;
19
- use matrix_sdk:: deserialized_responses:: { TimelineEvent , TimelineEventKind , UnsignedEventLocation } ;
19
+ use matrix_sdk:: deserialized_responses:: {
20
+ ThreadSummaryStatus , TimelineEvent , TimelineEventKind , UnsignedEventLocation ,
21
+ } ;
20
22
use ruma:: {
21
- events:: AnySyncTimelineEvent , push:: Action , serde:: Raw , MilliSecondsSinceUnixEpoch ,
23
+ events:: AnySyncTimelineEvent , push:: Action , serde:: Raw , EventId , MilliSecondsSinceUnixEpoch ,
22
24
OwnedEventId , OwnedTransactionId , OwnedUserId , UserId ,
23
25
} ;
24
26
use tracing:: { debug, instrument, warn} ;
@@ -544,6 +546,36 @@ impl<'a> TimelineStateTransaction<'a> {
544
546
}
545
547
}
546
548
549
+ // Attempt to load a thread's latest reply as an embedded timeline item, either
550
+ // using the event cache or the storage.
551
+ async fn fetch_latest_thread_reply (
552
+ & mut self ,
553
+ event_id : & EventId ,
554
+ room_data_provider : & impl RoomDataProvider ,
555
+ ) -> Option < Box < EmbeddedEvent > > {
556
+ let event = room_data_provider
557
+ . load_event ( event_id)
558
+ . await
559
+ . inspect_err ( |err| {
560
+ warn ! ( "Failed to load thread latest event: {err}" ) ;
561
+ } )
562
+ . ok ( ) ?;
563
+
564
+ EmbeddedEvent :: try_from_timeline_event (
565
+ event,
566
+ room_data_provider,
567
+ & self . items ,
568
+ & mut self . meta ,
569
+ )
570
+ . await
571
+ . inspect_err ( |err| {
572
+ warn ! ( "Failed to extract thread latest event into a timeline item content: {err}" ) ;
573
+ } )
574
+ . ok ( )
575
+ . flatten ( )
576
+ . map ( Box :: new)
577
+ }
578
+
547
579
/// Handle a remote event.
548
580
///
549
581
/// Returns whether an item has been removed from the timeline.
@@ -557,39 +589,12 @@ impl<'a> TimelineStateTransaction<'a> {
557
589
) -> RemovedItem {
558
590
let TimelineEvent { push_actions, kind, thread_summary } = event;
559
591
560
- let thread_summary = if let Some ( summary) = thread_summary. summary ( ) {
561
- let latest_reply_item = if let Some ( event_id) = summary. latest_reply . as_ref ( ) {
562
- // Attempt to load the timeline event, either from the event cache or the
563
- // storage.
564
- let event = room_data_provider
565
- . load_event ( event_id)
566
- . await
567
- . inspect_err ( |err| {
568
- warn ! ( "Failed to load thread latest event: {err}" ) ;
569
- } )
570
- . ok ( ) ;
571
-
572
- if let Some ( event) = event {
573
- EmbeddedEvent :: try_from_timeline_event (
574
- event,
575
- room_data_provider,
576
- & self . items ,
577
- & mut self . meta ,
578
- )
579
- . await
580
- . inspect_err ( |err| {
581
- warn ! ( "Failed to extract thread event into a timeline item content: {err}" ) ;
582
- } )
583
- . ok ( )
584
- . flatten ( )
585
- . map ( Box :: new)
586
- } else {
587
- None
588
- }
592
+ let thread_summary = if let ThreadSummaryStatus :: Some ( summary) = thread_summary {
593
+ let latest_reply_item = if let Some ( latest_reply) = summary. latest_reply {
594
+ self . fetch_latest_thread_reply ( & latest_reply, room_data_provider) . await
589
595
} else {
590
596
None
591
597
} ;
592
-
593
598
Some ( ThreadSummary {
594
599
latest_event : TimelineDetails :: from_initial_value ( latest_reply_item) ,
595
600
num_replies : summary. num_replies ,
0 commit comments