use std::ops::{Deref, DerefMut}; use filamento::{chat::Message, user::User}; use leptos_fetch::QueryClient; use reactive_stores::ArcStore; use uuid::Uuid; use leptos::prelude::*; use crate::{client::Client, user::MacawUser}; async fn get_message(id: Uuid) -> ArcStore { let client: Client = use_context().expect("no client in context"); ArcStore::new(client.get_message(id).await.unwrap()) } #[derive(Clone)] pub struct MacawMessage { pub message: ArcStore, pub user: MacawUser, } impl MacawMessage { pub fn got_message_and_user(message: Message, user: User) -> Self { let query_client: QueryClient = expect_context(); let id = message.id; let message_store = query_client.subscribe_value_local(get_message, move || id); if let Some(message_store) = message_store.get() { message_store.set(message); let user = MacawUser::got_user(user); Self { message: message_store, user } } else { let message_store = ArcStore::new(message); query_client.set_query_local(get_message, id, message_store.clone()); let user = MacawUser::got_user(user); Self { message: message_store, user, } } } } impl Deref for MacawMessage { type Target = ArcStore; fn deref(&self) -> &Self::Target { &self.message } } impl DerefMut for MacawMessage { fn deref_mut(&mut self) -> &mut Self::Target { &mut self.message } }