matrix_sdk_ffi/timeline/
configuration.rs1use std::sync::Arc;
2
3use matrix_sdk_ui::timeline::{
4 event_type_filter::TimelineEventTypeFilter as InnerTimelineEventTypeFilter,
5 TimelineReadReceiptTracking,
6};
7use ruma::{
8 events::{AnySyncTimelineEvent, TimelineEventType},
9 EventId,
10};
11
12use super::FocusEventError;
13use crate::{
14 error::ClientError,
15 event::{MessageLikeEventType, RoomMessageEventMessageType, StateEventType},
16};
17
18#[derive(uniffi::Object)]
19pub struct TimelineEventTypeFilter {
20 inner: InnerTimelineEventTypeFilter,
21}
22
23#[matrix_sdk_ffi_macros::export]
24impl TimelineEventTypeFilter {
25 #[uniffi::constructor]
26 pub fn include(event_types: Vec<FilterTimelineEventType>) -> Arc<Self> {
27 let event_types: Vec<TimelineEventType> =
28 event_types.iter().map(|t| t.clone().into()).collect();
29 Arc::new(Self { inner: InnerTimelineEventTypeFilter::Include(event_types) })
30 }
31
32 #[uniffi::constructor]
33 pub fn exclude(event_types: Vec<FilterTimelineEventType>) -> Arc<Self> {
34 let event_types: Vec<TimelineEventType> =
35 event_types.iter().map(|t| t.clone().into()).collect();
36 Arc::new(Self { inner: InnerTimelineEventTypeFilter::Exclude(event_types) })
37 }
38}
39
40impl TimelineEventTypeFilter {
41 pub(crate) fn filter(&self, event: &AnySyncTimelineEvent) -> bool {
44 self.inner.filter(event)
45 }
46}
47
48#[derive(uniffi::Enum, Clone)]
49pub enum FilterTimelineEventType {
50 MessageLike { event_type: MessageLikeEventType },
51 State { event_type: StateEventType },
52}
53
54impl From<FilterTimelineEventType> for TimelineEventType {
55 fn from(value: FilterTimelineEventType) -> TimelineEventType {
56 match value {
57 FilterTimelineEventType::MessageLike { event_type } => {
58 ruma::events::MessageLikeEventType::from(event_type).into()
59 }
60 FilterTimelineEventType::State { event_type } => {
61 ruma::events::StateEventType::from(event_type).into()
62 }
63 }
64 }
65}
66
67#[derive(uniffi::Enum)]
68pub enum TimelineFocus {
69 Live {
70 hide_threaded_events: bool,
72 },
73 Event {
74 event_id: String,
77 num_context_events: u16,
79 hide_threaded_events: bool,
81 },
82 Thread {
83 root_event_id: String,
85 },
86 PinnedEvents {
87 max_events_to_load: u16,
88 max_concurrent_requests: u16,
89 },
90}
91
92impl TryFrom<TimelineFocus> for matrix_sdk_ui::timeline::TimelineFocus {
93 type Error = ClientError;
94
95 fn try_from(
96 value: TimelineFocus,
97 ) -> Result<matrix_sdk_ui::timeline::TimelineFocus, Self::Error> {
98 match value {
99 TimelineFocus::Live { hide_threaded_events } => Ok(Self::Live { hide_threaded_events }),
100 TimelineFocus::Event { event_id, num_context_events, hide_threaded_events } => {
101 let parsed_event_id =
102 EventId::parse(&event_id).map_err(|err| FocusEventError::InvalidEventId {
103 event_id: event_id.clone(),
104 err: err.to_string(),
105 })?;
106
107 Ok(Self::Event {
108 target: parsed_event_id,
109 num_context_events,
110 hide_threaded_events,
111 })
112 }
113 TimelineFocus::Thread { root_event_id } => {
114 let parsed_root_event_id = EventId::parse(&root_event_id).map_err(|err| {
115 FocusEventError::InvalidEventId {
116 event_id: root_event_id.clone(),
117 err: err.to_string(),
118 }
119 })?;
120
121 Ok(Self::Thread { root_event_id: parsed_root_event_id })
122 }
123 TimelineFocus::PinnedEvents { max_events_to_load, max_concurrent_requests } => {
124 Ok(Self::PinnedEvents { max_events_to_load, max_concurrent_requests })
125 }
126 }
127 }
128}
129
130#[derive(uniffi::Enum)]
133pub enum DateDividerMode {
134 Daily,
135 Monthly,
136}
137
138impl From<DateDividerMode> for matrix_sdk_ui::timeline::DateDividerMode {
139 fn from(value: DateDividerMode) -> Self {
140 match value {
141 DateDividerMode::Daily => Self::Daily,
142 DateDividerMode::Monthly => Self::Monthly,
143 }
144 }
145}
146
147#[derive(uniffi::Enum)]
148pub enum TimelineFilter {
149 All,
151 OnlyMessage {
153 types: Vec<RoomMessageEventMessageType>,
156 },
157 EventTypeFilter { filter: Arc<TimelineEventTypeFilter> },
159}
160
161#[derive(uniffi::Record)]
163pub struct TimelineConfiguration {
164 pub focus: TimelineFocus,
166
167 pub filter: TimelineFilter,
169
170 pub internal_id_prefix: Option<String>,
174
175 pub date_divider_mode: DateDividerMode,
177
178 pub track_read_receipts: TimelineReadReceiptTracking,
184
185 pub report_utds: bool,
188}