blob: a47c75f902e52818b9324b6fe7c512b1992ade86 (
plain) (
tree)
|
|
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<Message> {
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<Message>,
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<Message>;
fn deref(&self) -> &Self::Target {
&self.message
}
}
impl DerefMut for MacawMessage {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.message
}
}
|