mirror of
https://github.com/matrix-org/matrix-rust-sdk.git
synced 2026-05-19 06:04:31 -04:00
ffi: Add RoomInfo
This commit is contained in:
committed by
Jonas Platte
parent
9b803eda12
commit
47e7360b04
@@ -30,6 +30,7 @@ mod notification;
|
||||
mod notification_settings;
|
||||
mod platform;
|
||||
mod room;
|
||||
mod room_info;
|
||||
mod room_list;
|
||||
mod room_member;
|
||||
mod session_verification;
|
||||
|
||||
@@ -56,6 +56,16 @@ pub enum Membership {
|
||||
Left,
|
||||
}
|
||||
|
||||
impl From<RoomState> for Membership {
|
||||
fn from(value: RoomState) -> Self {
|
||||
match value {
|
||||
RoomState::Invited => Membership::Invited,
|
||||
RoomState::Joined => Membership::Joined,
|
||||
RoomState::Left => Membership::Left,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) type TimelineLock = Arc<RwLock<Option<Arc<Timeline>>>>;
|
||||
|
||||
#[derive(uniffi::Object)]
|
||||
@@ -117,11 +127,7 @@ impl Room {
|
||||
}
|
||||
|
||||
pub fn membership(&self) -> Membership {
|
||||
match self.inner.state() {
|
||||
RoomState::Invited => Membership::Invited,
|
||||
RoomState::Joined => Membership::Joined,
|
||||
RoomState::Left => Membership::Left,
|
||||
}
|
||||
self.inner.state().into()
|
||||
}
|
||||
|
||||
pub fn inviter(&self) -> Option<Arc<RoomMember>> {
|
||||
|
||||
71
bindings/matrix-sdk-ffi/src/room_info.rs
Normal file
71
bindings/matrix-sdk-ffi/src/room_info.rs
Normal file
@@ -0,0 +1,71 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use matrix_sdk::RoomState;
|
||||
use matrix_sdk_ui::room_list_service::Room;
|
||||
|
||||
use crate::{room::Membership, room_member::RoomMember, timeline::EventTimelineItem};
|
||||
|
||||
#[derive(uniffi::Record)]
|
||||
pub struct RoomInfo {
|
||||
id: String,
|
||||
name: Option<String>,
|
||||
topic: Option<String>,
|
||||
avatar_url: Option<String>,
|
||||
is_direct: bool,
|
||||
/// Whether the room is encrypted.
|
||||
///
|
||||
/// Currently always `None` (unknown) for invited rooms.
|
||||
is_encrypted: Option<bool>,
|
||||
is_public: bool,
|
||||
is_space: bool,
|
||||
is_tombstoned: bool,
|
||||
canonical_alias: Option<String>,
|
||||
alternative_aliases: Vec<String>,
|
||||
membership: Membership,
|
||||
latest_event: Option<Arc<EventTimelineItem>>,
|
||||
inviter: Option<Arc<RoomMember>>,
|
||||
active_members_count: u64,
|
||||
invited_members_count: u64,
|
||||
joined_members_count: u64,
|
||||
highlight_count: u64,
|
||||
notification_count: u64,
|
||||
}
|
||||
|
||||
impl RoomInfo {
|
||||
pub(crate) async fn new(room: &Room) -> matrix_sdk::Result<Self> {
|
||||
let inner = room.inner_room();
|
||||
let unread_notification_counts = inner.unread_notification_counts();
|
||||
|
||||
Ok(Self {
|
||||
id: inner.room_id().to_string(),
|
||||
name: inner.name(),
|
||||
topic: inner.topic(),
|
||||
avatar_url: inner.avatar_url().map(Into::into),
|
||||
is_direct: inner.is_direct().await?,
|
||||
is_encrypted: match inner.state() {
|
||||
RoomState::Invited => None,
|
||||
_ => Some(inner.is_encrypted().await?),
|
||||
},
|
||||
is_public: inner.is_public(),
|
||||
is_space: inner.is_space(),
|
||||
is_tombstoned: inner.is_tombstoned(),
|
||||
canonical_alias: inner.canonical_alias().map(Into::into),
|
||||
alternative_aliases: inner.alt_aliases().into_iter().map(Into::into).collect(),
|
||||
membership: inner.state().into(),
|
||||
latest_event: room.latest_event().await.map(EventTimelineItem).map(Arc::new),
|
||||
inviter: match inner.state() {
|
||||
RoomState::Invited => inner
|
||||
.invite_details()
|
||||
.await?
|
||||
.inviter
|
||||
.map(|inner| Arc::new(RoomMember { inner })),
|
||||
_ => None,
|
||||
},
|
||||
active_members_count: inner.active_members_count(),
|
||||
invited_members_count: inner.invited_members_count(),
|
||||
joined_members_count: inner.joined_members_count(),
|
||||
highlight_count: unread_notification_counts.highlight_count,
|
||||
notification_count: unread_notification_counts.notification_count,
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,10 @@ use matrix_sdk::{
|
||||
use matrix_sdk_ui::room_list_service::filters::{new_filter_all, new_filter_fuzzy_match_room_name};
|
||||
use tokio::sync::RwLock;
|
||||
|
||||
use crate::{room::Room, timeline::EventTimelineItem, TaskHandle, RUNTIME};
|
||||
use crate::{
|
||||
error::ClientError, room::Room, room_info::RoomInfo, timeline::EventTimelineItem, TaskHandle,
|
||||
RUNTIME,
|
||||
};
|
||||
|
||||
#[derive(uniffi::Error)]
|
||||
pub enum RoomListError {
|
||||
@@ -353,6 +356,10 @@ impl RoomListItem {
|
||||
self.inner.inner_room().canonical_alias().map(|alias| alias.to_string())
|
||||
}
|
||||
|
||||
pub async fn room_info(&self) -> Result<RoomInfo, ClientError> {
|
||||
Ok(RoomInfo::new(&self.inner).await?)
|
||||
}
|
||||
|
||||
/// Building a `Room`.
|
||||
///
|
||||
/// Be careful that building a `Room` builds its entire `Timeline` at the
|
||||
|
||||
@@ -44,7 +44,7 @@ impl From<matrix_sdk::ruma::events::room::member::MembershipState> for Membershi
|
||||
|
||||
#[derive(uniffi::Object)]
|
||||
pub struct RoomMember {
|
||||
inner: SdkRoomMember,
|
||||
pub(crate) inner: SdkRoomMember,
|
||||
}
|
||||
|
||||
#[uniffi::export]
|
||||
|
||||
Reference in New Issue
Block a user