Files
beau-gosse-du-92/src/ui/store/space.rs
2024-05-26 11:53:47 +02:00

54 lines
1.2 KiB
Rust

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},
};
#[modx::props(id, name)]
#[modx::store]
pub struct Store {
id: SpaceId,
name: Option<String>,
room_ids: HashSet<RoomId>,
}
#[derive(Clone)]
pub struct Space {
store: RefCell<Store>,
#[allow(dead_code)]
domain: Rc<dyn SpaceStoreConsumerInterface>,
}
impl Space {
pub fn signal(&self) -> Store {
*self.store.borrow()
}
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,
}
}
pub fn add_room(&self, room_id: RoomId) {
let mut store = self.store.borrow_mut();
store.room_ids.write().insert(room_id);
}
}
impl SpaceStoreProviderInterface for Space {
fn set_name(&self, name: Option<String>) {
let mut store = self.store.borrow_mut();
store.name.set(name);
}
}