2 Commits

Author SHA1 Message Date
d77c2a9d12 ♻️ Use of Store interfaces 2024-05-15 19:08:52 +02:00
bc30670f6e ⬆️ Bumps modx version (git -> 0.1.2) 2024-05-15 19:08:49 +02:00
8 changed files with 179 additions and 45 deletions

View File

@@ -12,8 +12,7 @@ web = ["dioxus/web"]
dioxus = "0.5.*" dioxus = "0.5.*"
dioxus-sdk = { version = "0.5.*", features = ["utils"] } dioxus-sdk = { version = "0.5.*", features = ["utils"] }
dioxus-free-icons = { version = "0.8.*", features = ["ionicons", "font-awesome-solid", "material-design-icons-navigation"] } dioxus-free-icons = { version = "0.8.*", features = ["ionicons", "font-awesome-solid", "material-design-icons-navigation"] }
# modx = "0.1" modx = "0.1.2"
modx = { git = "https://github.com/ASR-ASU/modx.git", branch = "asr/fix-props-visibility" }
# matrix-sdk = { git = "https://github.com/matrix-org/matrix-rust-sdk.git", branch = "main", default-features = false, features = ["js", "rustls-tls"] } # matrix-sdk = { git = "https://github.com/matrix-org/matrix-rust-sdk.git", branch = "main", default-features = false, features = ["js", "rustls-tls"] }
matrix-sdk = { version = "0.7.*", default-features = false, features = ["js", "rustls-tls"] } matrix-sdk = { version = "0.7.*", default-features = false, features = ["js", "rustls-tls"] }

View File

@@ -11,7 +11,9 @@ use super::{
}, },
room::{Room, RoomId}, room::{Room, RoomId},
space::{Space, SpaceId}, space::{Space, SpaceId},
store_interface::AccountStoreProviderInterface, store_interface::{
AccountStoreProviderInterface, RoomStoreConsumerInterface, SpaceStoreConsumerInterface,
},
}; };
type Rooms = HashMap<RoomId, Rc<Room>>; type Rooms = HashMap<RoomId, Rc<Room>>;
@@ -100,7 +102,9 @@ impl AccountMessagingConsumerInterface for Account {
.borrow_mut() .borrow_mut()
.insert(room_id, Rc::clone(&room)); .insert(room_id, Rc::clone(&room));
let room_store = self.store.on_new_room(Rc::clone(&room)); let room_store = self
.store
.on_new_room(Rc::clone(&room) as Rc<dyn RoomStoreConsumerInterface>);
room.set_store(room_store); room.set_store(room_store);
@@ -114,7 +118,9 @@ impl AccountMessagingConsumerInterface for Account {
.borrow_mut() .borrow_mut()
.insert(space_id, Rc::clone(&space)); .insert(space_id, Rc::clone(&space));
let space_store = self.store.on_new_space(Rc::clone(&space)); let space_store = self
.store
.on_new_space(Rc::clone(&space) as Rc<dyn SpaceStoreConsumerInterface>);
space.set_store(space_store); space.set_store(space_store);

View File

@@ -207,3 +207,17 @@ impl RoomMessagingConsumerInterface for Room {
trace!("Room::on_new_name({:?})", name); trace!("Room::on_new_name({:?})", name);
} }
} }
impl RoomStoreConsumerInterface for Room {
fn id(&self) -> &RoomId {
&self.id
}
fn is_direct(&self) -> Option<bool> {
self.is_direct
}
fn name(&self) -> Option<String> {
self.name.borrow().clone()
}
}

View File

@@ -8,7 +8,7 @@ use super::{
common::Avatar, common::Avatar,
messaging_interface::{SpaceMessagingConsumerInterface, SpaceMessagingProviderInterface}, messaging_interface::{SpaceMessagingConsumerInterface, SpaceMessagingProviderInterface},
room::RoomId, room::RoomId,
store_interface::SpaceStoreProviderInterface, store_interface::{SpaceStoreConsumerInterface, SpaceStoreProviderInterface},
}; };
pub type SpaceId = OwnedRoomId; pub type SpaceId = OwnedRoomId;
@@ -89,3 +89,13 @@ impl SpaceMessagingConsumerInterface for Space {
} }
} }
} }
impl SpaceStoreConsumerInterface for Space {
fn id(&self) -> &SpaceId {
&self.id
}
fn name(&self) -> Option<String> {
self.name.borrow().clone()
}
}

View File

@@ -1,21 +1,46 @@
use std::rc::Rc; use std::rc::Rc;
use super::{room::Room, space::Space}; use super::{
room::{Invitation, RoomId},
room_member::RoomMember,
space::SpaceId,
};
#[allow(dead_code)] #[allow(dead_code)]
pub trait AccountStoreConsumerInterface {} pub trait AccountStoreConsumerInterface {}
pub trait AccountStoreProviderInterface { pub trait AccountStoreProviderInterface {
fn on_new_room(&self, room: Rc<Room>) -> Rc<dyn RoomStoreProviderInterface>; fn on_new_room(
fn on_new_space(&self, space: Rc<Space>) -> Rc<dyn SpaceStoreProviderInterface>; &self,
room: Rc<dyn RoomStoreConsumerInterface>,
) -> Rc<dyn RoomStoreProviderInterface>;
fn on_new_space(
&self,
space: Rc<dyn SpaceStoreConsumerInterface>,
) -> Rc<dyn SpaceStoreProviderInterface>;
} }
#[allow(dead_code)] #[allow(dead_code)]
pub trait RoomStoreConsumerInterface {} pub trait RoomStoreConsumerInterface {
pub trait RoomStoreProviderInterface {} fn id(&self) -> &RoomId;
fn is_direct(&self) -> Option<bool>;
fn name(&self) -> Option<String>;
}
pub trait RoomStoreProviderInterface {
fn on_new_member(&self, member: RoomMember);
fn on_new_name(&self, name: Option<String>);
fn on_invitation(&self, invitation: Invitation);
}
#[allow(dead_code)] #[allow(dead_code)]
pub trait SpaceStoreConsumerInterface {} pub trait SpaceStoreConsumerInterface {
fn id(&self) -> &SpaceId;
fn name(&self) -> Option<String>;
}
pub trait SpaceStoreProviderInterface { pub trait SpaceStoreProviderInterface {
fn set_name(&self, _name: Option<String>) {} fn set_name(&self, _name: Option<String>) {}
} }

View File

@@ -1,50 +1,52 @@
pub(crate) mod room; pub(crate) mod room;
pub(crate) mod space; pub(crate) mod space;
use std::cell::RefCell;
use std::{collections::HashMap, rc::Rc}; use std::{collections::HashMap, rc::Rc};
use async_trait::async_trait; use async_trait::async_trait;
use dioxus::prelude::*; use dioxus::prelude::*;
use crate::domain::model::room::{Room as DomainRoom, RoomId}; use crate::domain::model::room::RoomId;
use crate::domain::model::space::{Space as DomainSpace, SpaceId}; use crate::domain::model::space::SpaceId;
use crate::domain::model::store_interface::{ use crate::domain::model::store_interface::{
AccountStoreProviderInterface, RoomStoreProviderInterface, SpaceStoreProviderInterface, AccountStoreProviderInterface, RoomStoreConsumerInterface, RoomStoreProviderInterface,
SpaceStoreConsumerInterface, SpaceStoreProviderInterface,
}; };
use room::{Room, RoomProps}; use room::Room;
use space::{Space, SpaceProps}; use space::Space;
#[modx::store] #[modx::store]
pub struct Store { pub struct Store {
rooms: HashMap<RoomId, Room>, rooms: HashMap<RoomId, Rc<Room>>,
spaces: HashMap<SpaceId, Space>, spaces: HashMap<SpaceId, Rc<Space>>,
} }
#[async_trait(?Send)] #[async_trait(?Send)]
impl AccountStoreProviderInterface for GlobalSignal<Store> { impl AccountStoreProviderInterface for GlobalSignal<Store> {
fn on_new_room(&self, domain_room: Rc<DomainRoom>) -> Rc<dyn RoomStoreProviderInterface> { fn on_new_room(
&self,
domain_room: Rc<dyn RoomStoreConsumerInterface>,
) -> Rc<dyn RoomStoreProviderInterface> {
let room_id = domain_room.id(); let room_id = domain_room.id();
let room = Rc::new(Room::from_domain(Rc::clone(&domain_room)));
let props = RoomProps::new(room_id.clone(), domain_room.name());
let room = Room::new(props);
let mut rooms = self.read().rooms; let mut rooms = self.read().rooms;
rooms.write().insert(room_id.clone(), room); rooms.write().insert(room_id.clone(), Rc::clone(&room));
Rc::new(room.clone()) room
} }
fn on_new_space(&self, domain_space: Rc<DomainSpace>) -> Rc<dyn SpaceStoreProviderInterface> { fn on_new_space(
&self,
domain_space: Rc<dyn SpaceStoreConsumerInterface>,
) -> Rc<dyn SpaceStoreProviderInterface> {
let space_id = domain_space.id(); let space_id = domain_space.id();
let space = Rc::new(Space::from_domain(Rc::clone(&domain_space)));
let props = SpaceProps::new(space_id.clone(), domain_space.name());
let space = Space::new(props);
let mut spaces = self.read().spaces; let mut spaces = self.read().spaces;
spaces.write().insert(space_id.clone(), space); spaces.write().insert(space_id.clone(), Rc::clone(&space));
Rc::new(RefCell::new(space.clone())) space
} }
} }

View File

@@ -1,21 +1,73 @@
use std::cell::RefCell;
use std::rc::Rc;
use dioxus::prelude::*; use dioxus::prelude::*;
use crate::domain::model::room::Invitation;
use crate::domain::model::{ use crate::domain::model::{
room::RoomId, room_member::RoomMember, store_interface::RoomStoreProviderInterface, room::RoomId,
room_member::RoomMember,
store_interface::{RoomStoreConsumerInterface, RoomStoreProviderInterface},
}; };
#[modx::props(id, name)] #[modx::props(id, is_direct, name)]
#[modx::store] #[modx::store]
pub struct Room { pub struct Store {
id: RoomId, id: RoomId,
is_direct: Option<bool>,
name: Option<String>, name: Option<String>,
members: Vec<RoomMember>, members: Vec<RoomMember>,
invitations: Vec<Invitation>,
is_invited: bool,
}
#[derive(Clone)]
pub struct Room {
store: RefCell<Store>,
domain: Rc<dyn RoomStoreConsumerInterface>,
}
impl Room {
pub fn signal(&self) -> Store {
self.store.borrow().clone()
}
pub fn from_domain(room: Rc<dyn RoomStoreConsumerInterface>) -> Self {
let props = StoreProps::new(room.id().clone(), room.is_direct(), room.name());
Self {
store: RefCell::new(Store::new(props)),
domain: room,
}
}
} }
impl PartialEq for Room { impl PartialEq for Room {
fn eq(&self, other: &Self) -> bool { fn eq(&self, other: &Self) -> bool {
self.id == other.id self.store.borrow().id == other.store.borrow().id
} }
} }
impl RoomStoreProviderInterface for Room {} 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<String>) {
let mut store = self.store.borrow_mut();
store.name.set(name);
}
fn on_invitation(&self, invitation: Invitation) {
let mut store = self.store.borrow_mut();
if !store.is_invited() && invitation.is_account_user() {
store.is_invited.set(true);
}
store.invitations.write().push(invitation);
}
}

View File

@@ -1,24 +1,50 @@
use std::cell::RefCell; use std::cell::RefCell;
use std::rc::Rc;
use dioxus::prelude::*; use dioxus::prelude::*;
use crate::domain::model::{space::SpaceId, store_interface::SpaceStoreProviderInterface}; use crate::domain::model::{
space::SpaceId,
store_interface::{SpaceStoreConsumerInterface, SpaceStoreProviderInterface},
};
#[modx::props(id, name)] #[modx::props(id, name)]
#[modx::store] #[modx::store]
pub struct Space { pub struct Store {
id: SpaceId, id: SpaceId,
name: Option<String>, name: Option<String>,
} }
impl PartialEq for Space { #[derive(Clone)]
fn eq(&self, other: &Self) -> bool { pub struct Space {
self.id == other.id store: RefCell<Store>,
domain: Rc<dyn SpaceStoreConsumerInterface>,
}
impl Space {
pub fn signal(&self) -> Store {
self.store.borrow().clone()
}
pub fn from_domain(space: Rc<dyn SpaceStoreConsumerInterface>) -> Self {
let props = StoreProps::new(space.id().clone(), space.name());
Self {
store: RefCell::new(Store::new(props)),
domain: space,
}
} }
} }
impl SpaceStoreProviderInterface for RefCell<Space> { impl PartialEq for Space {
fn eq(&self, other: &Self) -> bool {
self.store.borrow().id == other.store.borrow().id
}
}
impl SpaceStoreProviderInterface for Space {
fn set_name(&self, name: Option<String>) { fn set_name(&self, name: Option<String>) {
self.borrow_mut().name.set(name); let mut store = self.store.borrow_mut();
store.name.set(name);
} }
} }