Skip to content

Commit acb7f9b

Browse files
committed
ffi: allow creating a new detached timeline from a room
1 parent 7530948 commit acb7f9b

File tree

1 file changed

+37
-2
lines changed

1 file changed

+37
-2
lines changed

bindings/matrix-sdk-ffi/src/room.rs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@ use std::sync::Arc;
22

33
use anyhow::{Context, Result};
44
use matrix_sdk::{
5+
event_cache::paginator::PaginatorError,
56
room::{power_levels::RoomPowerLevelChanges, Room as SdkRoom, RoomMemberRole},
67
RoomMemberships, RoomState,
78
};
8-
use matrix_sdk_ui::timeline::RoomExt;
9+
use matrix_sdk_ui::timeline::{PaginationError, RoomExt, TimelineFocus};
910
use mime::Mime;
1011
use ruma::{
1112
api::client::room::report_content,
@@ -30,7 +31,7 @@ use crate::{
3031
room_info::RoomInfo,
3132
room_member::RoomMember,
3233
ruma::ImageInfo,
33-
timeline::{EventTimelineItem, ReceiptType, Timeline},
34+
timeline::{EventTimelineItem, FocusEventError, ReceiptType, Timeline},
3435
utils::u64_to_uint,
3536
TaskHandle,
3637
};
@@ -167,6 +168,40 @@ impl Room {
167168
}
168169
}
169170

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+
170205
pub fn display_name(&self) -> Result<String, ClientError> {
171206
let r = self.inner.clone();
172207
RUNTIME.block_on(async move { Ok(r.display_name().await?.to_string()) })

0 commit comments

Comments
 (0)