♻️ Add Account, Room and Space UI store structs

This commit is contained in:
2024-05-11 15:24:49 +02:00
parent bc6b02bc34
commit 18a797bc3f
12 changed files with 152 additions and 183 deletions

View File

@@ -1,2 +1,3 @@
pub(crate) mod components;
pub(crate) mod store;
pub(crate) mod views;

50
src/ui/store/mod.rs Normal file
View File

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

21
src/ui/store/room.rs Normal file
View File

@@ -0,0 +1,21 @@
use dioxus::prelude::*;
use crate::domain::model::{
room::RoomId, room_member::RoomMember, store_interface::RoomStoreProviderInterface,
};
#[modx::props(id, name)]
#[modx::store]
pub struct Room {
id: RoomId,
name: Option<String>,
members: Vec<RoomMember>,
}
impl PartialEq for Room {
fn eq(&self, other: &Self) -> bool {
self.id == other.id
}
}
impl RoomStoreProviderInterface for Room {}

24
src/ui/store/space.rs Normal file
View File

@@ -0,0 +1,24 @@
use std::cell::RefCell;
use dioxus::prelude::*;
use crate::domain::model::{space::SpaceId, store_interface::SpaceStoreProviderInterface};
#[modx::props(id, name)]
#[modx::store]
pub struct Space {
id: SpaceId,
name: Option<String>,
}
impl PartialEq for Space {
fn eq(&self, other: &Self) -> bool {
self.id == other.id
}
}
impl SpaceStoreProviderInterface for RefCell<Space> {
fn set_name(&self, name: Option<String>) {
self.borrow_mut().name.set(name);
}
}