From 33bb7130943b5f74b3b0f08c5e6d8f7c5e54d4c0 Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Sun, 1 Jun 2025 20:17:57 +0100 Subject: feat: switch to leptos-fetch for state management --- src/chat.rs | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) (limited to 'src/chat.rs') 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 { + 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>, + pub chat: ArcStore, pub user: MacawUser, // user: StateListener>, } impl MacawChat { pub fn got_chat_and_user(chat: Chat, user: User) -> Self { - let chat_state_store: StateStore> = - 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>; + type Target = ArcStore; fn deref(&self) -> &Self::Target { &self.chat -- cgit