@@ -2,10 +2,11 @@ use std::sync::Arc;
2
2
3
3
use anyhow:: { Context , Result } ;
4
4
use matrix_sdk:: {
5
+ event_cache:: paginator:: PaginatorError ,
5
6
room:: { power_levels:: RoomPowerLevelChanges , Room as SdkRoom , RoomMemberRole } ,
6
7
RoomMemberships , RoomState ,
7
8
} ;
8
- use matrix_sdk_ui:: timeline:: RoomExt ;
9
+ use matrix_sdk_ui:: timeline:: { PaginationError , RoomExt , TimelineFocus } ;
9
10
use mime:: Mime ;
10
11
use ruma:: {
11
12
api:: client:: room:: report_content,
@@ -30,7 +31,7 @@ use crate::{
30
31
room_info:: RoomInfo ,
31
32
room_member:: RoomMember ,
32
33
ruma:: ImageInfo ,
33
- timeline:: { EventTimelineItem , ReceiptType , Timeline } ,
34
+ timeline:: { EventTimelineItem , FocusEventError , ReceiptType , Timeline } ,
34
35
utils:: u64_to_uint,
35
36
TaskHandle ,
36
37
} ;
@@ -167,6 +168,40 @@ impl Room {
167
168
}
168
169
}
169
170
171
+ /// Returns a timeline focused on the given event.
172
+ ///
173
+ /// Note: this timeline is independent from that returned with
174
+ /// [`Self::timeline`], and as such it is not cached.
175
+ pub async fn timeline_focused_on_event (
176
+ & self ,
177
+ event_id : String ,
178
+ ) -> Result < Arc < Timeline > , FocusEventError > {
179
+ let parsed_event_id = EventId :: parse ( & event_id) . map_err ( |err| {
180
+ FocusEventError :: InvalidEventId { event_id : event_id. clone ( ) , err : err. to_string ( ) }
181
+ } ) ?;
182
+
183
+ let room = & self . inner ;
184
+
185
+ let timeline = match matrix_sdk_ui:: timeline:: Timeline :: builder ( room)
186
+ . with_focus ( TimelineFocus :: Event ( parsed_event_id) )
187
+ . build ( )
188
+ . await
189
+ {
190
+ Ok ( t) => t,
191
+ Err ( err) => {
192
+ if let matrix_sdk_ui:: timeline:: Error :: PaginationError (
193
+ PaginationError :: Paginator ( PaginatorError :: EventNotFound ( ..) ) ,
194
+ ) = err
195
+ {
196
+ return Err ( FocusEventError :: EventNotFound { event_id : event_id. to_string ( ) } ) ;
197
+ }
198
+ return Err ( FocusEventError :: Other { msg : err. to_string ( ) } ) ;
199
+ }
200
+ } ;
201
+
202
+ Ok ( Timeline :: new ( timeline) )
203
+ }
204
+
170
205
pub fn display_name ( & self ) -> Result < String , ClientError > {
171
206
let r = self . inner . clone ( ) ;
172
207
RUNTIME . block_on ( async move { Ok ( r. display_name ( ) . await ?. to_string ( ) ) } )
0 commit comments