diff options
author | 2025-06-01 20:17:57 +0100 | |
---|---|---|
committer | 2025-06-01 20:17:57 +0100 | |
commit | 33bb7130943b5f74b3b0f08c5e6d8f7c5e54d4c0 (patch) | |
tree | 0617888d360550508ede95aa12c00375cde4e70b /src/message.rs | |
parent | 6ee4190a26f32bfa953302ee363ad3bb6c384ebb (diff) | |
download | macaw-web-33bb7130943b5f74b3b0f08c5e6d8f7c5e54d4c0.tar.gz macaw-web-33bb7130943b5f74b3b0f08c5e6d8f7c5e54d4c0.tar.bz2 macaw-web-33bb7130943b5f74b3b0f08c5e6d8f7c5e54d4c0.zip |
feat: switch to leptos-fetch for state management
Diffstat (limited to '')
-rw-r--r-- | src/message.rs | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/src/message.rs b/src/message.rs index e5caed1..a47c75f 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1,30 +1,48 @@ 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::{state_store::{StateListener, StateStore}, user::MacawUser}; +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: StateListener<Uuid, ArcStore<Message>>, + pub message: ArcStore<Message>, pub user: MacawUser, } impl MacawMessage { pub fn got_message_and_user(message: Message, user: User) -> Self { - let message_state_store: StateStore<Uuid, ArcStore<Message>> = - use_context().expect("no message state store"); - let message = message_state_store.store(message.id, ArcStore::new(message)); - let user = MacawUser::got_user(user); - Self { message, user } + 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 = StateListener<Uuid, ArcStore<Message>>; + type Target = ArcStore<Message>; fn deref(&self) -> &Self::Target { &self.message |