diff --git a/src/domain/model/room.rs b/src/domain/model/room.rs index 53d757d..93d0da5 100644 --- a/src/domain/model/room.rs +++ b/src/domain/model/room.rs @@ -208,6 +208,7 @@ impl RoomMessagingConsumerInterface for Room { } } +#[async_trait(?Send)] impl RoomStoreConsumerInterface for Room { fn id(&self) -> &RoomId { &self.id @@ -220,4 +221,8 @@ impl RoomStoreConsumerInterface for Room { fn name(&self) -> Option { self.name.borrow().clone() } + + fn spaces(&self) -> &Vec { + &self.spaces + } } diff --git a/src/domain/model/store_interface.rs b/src/domain/model/store_interface.rs index 520f700..2077d05 100644 --- a/src/domain/model/store_interface.rs +++ b/src/domain/model/store_interface.rs @@ -1,6 +1,9 @@ use std::rc::Rc; +use async_trait::async_trait; + use super::{ + common::Avatar, room::{Invitation, RoomId}, room_member::RoomMember, space::SpaceId, @@ -20,24 +23,25 @@ pub trait AccountStoreProviderInterface { ) -> Rc; } -#[allow(dead_code)] +#[async_trait(?Send)] pub trait RoomStoreConsumerInterface { fn id(&self) -> &RoomId; - fn is_direct(&self) -> Option; fn name(&self) -> Option; + async fn avatar(&self) -> Option; + fn spaces(&self) -> &Vec; } pub trait RoomStoreProviderInterface { - fn on_new_member(&self, member: RoomMember); fn on_new_name(&self, name: Option); + fn on_new_avatar(&self, avatar: Option); + fn on_new_member(&self, member: RoomMember); fn on_invitation(&self, invitation: Invitation); } #[allow(dead_code)] pub trait SpaceStoreConsumerInterface { fn id(&self) -> &SpaceId; - fn name(&self) -> Option; } diff --git a/src/ui/store/mod.rs b/src/ui/store/mod.rs index 0343ee4..208ae74 100644 --- a/src/ui/store/mod.rs +++ b/src/ui/store/mod.rs @@ -5,6 +5,7 @@ use std::{collections::HashMap, rc::Rc}; use async_trait::async_trait; use dioxus::prelude::*; +use tracing::error; use crate::domain::model::room::RoomId; use crate::domain::model::space::SpaceId; @@ -34,6 +35,15 @@ impl AccountStoreProviderInterface for GlobalSignal { let mut rooms = self.read().rooms; rooms.write().insert(room_id.clone(), Rc::clone(&room)); + let spaces = self.read().spaces; + for space_id in domain_room.spaces() { + if let Some(space) = spaces.read().get(space_id) { + space.add_room(room_id.clone()); + } else { + error!("No {} space found", space_id); + } + } + room } diff --git a/src/ui/store/room.rs b/src/ui/store/room.rs index a1c1396..a5cb542 100644 --- a/src/ui/store/room.rs +++ b/src/ui/store/room.rs @@ -3,24 +3,28 @@ use std::rc::Rc; use dioxus::prelude::*; +use crate::domain::model::common::Avatar; use crate::domain::model::room::Invitation; +use crate::domain::model::space::SpaceId; use crate::domain::model::{ room::RoomId, room_member::RoomMember, store_interface::{RoomStoreConsumerInterface, RoomStoreProviderInterface}, }; -#[modx::props(id, is_direct, name)] +#[modx::props(id, is_direct, name, spaces)] #[modx::store] pub struct Store { id: RoomId, is_direct: Option, name: Option, - + avatar: Option, members: Vec, invitations: Vec, is_invited: bool, + + spaces: Vec, } #[derive(Clone)] @@ -35,32 +39,40 @@ impl Room { } pub fn from_domain(room: Rc) -> Self { - let props = StoreProps::new(room.id().clone(), room.is_direct(), room.name()); + let props = StoreProps::new( + room.id().clone(), + room.is_direct(), + room.name(), + room.spaces().clone(), + ); Self { store: RefCell::new(Store::new(props)), domain: room, } } -} -impl PartialEq for Room { - fn eq(&self, other: &Self) -> bool { - self.store.borrow().id == other.store.borrow().id + pub async fn get_avatar(&self) -> Option { + self.domain.avatar().await } } impl RoomStoreProviderInterface for Room { - fn on_new_member(&self, member: RoomMember) { - let mut store = self.store.borrow_mut(); - store.members.write().push(member); - } - fn on_new_name(&self, name: Option) { let mut store = self.store.borrow_mut(); store.name.set(name); } + fn on_new_avatar(&self, avatar: Option) { + let mut store = self.store.borrow_mut(); + store.avatar.set(avatar); + } + + fn on_new_member(&self, member: RoomMember) { + let mut store = self.store.borrow_mut(); + store.members.write().push(member); + } + fn on_invitation(&self, invitation: Invitation) { let mut store = self.store.borrow_mut(); diff --git a/src/ui/store/space.rs b/src/ui/store/space.rs index 4bb7897..c476bae 100644 --- a/src/ui/store/space.rs +++ b/src/ui/store/space.rs @@ -1,9 +1,10 @@ -use std::cell::RefCell; use std::rc::Rc; +use std::{cell::RefCell, collections::HashSet}; use dioxus::prelude::*; use crate::domain::model::{ + room::RoomId, space::SpaceId, store_interface::{SpaceStoreConsumerInterface, SpaceStoreProviderInterface}, }; @@ -13,6 +14,7 @@ use crate::domain::model::{ pub struct Store { id: SpaceId, name: Option, + room_ids: HashSet, } #[derive(Clone)] @@ -34,11 +36,10 @@ impl Space { domain: space, } } -} -impl PartialEq for Space { - fn eq(&self, other: &Self) -> bool { - self.store.borrow().id == other.store.borrow().id + pub fn add_room(&self, room_id: RoomId) { + let mut store = self.store.borrow_mut(); + store.room_ids.write().insert(room_id); } }