diff options
author | 2025-06-01 20:17:57 +0100 | |
---|---|---|
committer | 2025-06-01 20:17:57 +0100 | |
commit | 33bb7130943b5f74b3b0f08c5e6d8f7c5e54d4c0 (patch) | |
tree | 0617888d360550508ede95aa12c00375cde4e70b /src/chat.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 'src/chat.rs')
-rw-r--r-- | src/chat.rs | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/src/chat.rs b/src/chat.rs index 6785b06..a1ced32 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -2,30 +2,49 @@ use std::ops::{Deref, DerefMut}; use filamento::{chat::Chat, user::User}; use jid::BareJID; +use leptos_fetch::QueryClient; use reactive_stores::ArcStore; use leptos::prelude::*; -use crate::{state_store::{StateListener, StateStore}, user::MacawUser}; +use crate::{client::Client, user::MacawUser}; + +async fn get_chat(jid: BareJID) -> ArcStore<Chat> { + let client: Client = use_context().expect("no client in context"); + ArcStore::new(client.get_chat(jid).await.unwrap()) +} #[derive(Clone)] pub struct MacawChat { - pub chat: StateListener<BareJID, ArcStore<Chat>>, + pub chat: ArcStore<Chat>, pub user: MacawUser, // user: StateListener<BareJID, ArcStore<User>>, } impl MacawChat { pub fn got_chat_and_user(chat: Chat, user: User) -> Self { - let chat_state_store: StateStore<BareJID, ArcStore<Chat>> = - use_context().expect("no chat state store"); - let chat = chat_state_store.store(chat.correspondent.clone(), ArcStore::new(chat)); - let user = MacawUser::got_user(user); - Self { chat, user } + let query_client: QueryClient = expect_context(); + + let jid = chat.correspondent.clone(); + let chat_store = query_client.subscribe_value_local(get_chat, move || jid.clone()); + if let Some(chat_store) = chat_store.get() { + chat_store.set(chat); + let user = MacawUser::got_user(user); + Self { chat: chat_store, user } + } else { + let jid = chat.correspondent.clone(); + let chat_store = ArcStore::new(chat); + query_client.set_query_local(get_chat, jid, chat_store.clone()); + let user = MacawUser::got_user(user); + Self { + chat: chat_store, + user, + } + } } } impl Deref for MacawChat { - type Target = StateListener<BareJID, ArcStore<Chat>>; + type Target = ArcStore<Chat>; fn deref(&self) -> &Self::Target { &self.chat |