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, room_ids: HashSet, } #[derive(Clone)] pub struct Space { store: RefCell, #[allow(dead_code)] domain: Rc, } impl Space { pub fn signal(&self) -> Store { *self.store.borrow() } pub fn from_domain(space: Rc) -> 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) { let mut store = self.store.borrow_mut(); store.name.set(name); } }