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/components/new_chat.rs | 69 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 9 deletions(-) (limited to 'src/components/new_chat.rs') diff --git a/src/components/new_chat.rs b/src/components/new_chat.rs index 8047afb..6d64c96 100644 --- a/src/components/new_chat.rs +++ b/src/components/new_chat.rs @@ -3,10 +3,11 @@ use std::str::FromStr; use filamento::{chat::Chat, error::{CommandError, DatabaseError}, user::User}; use jid::{BareJID, JID}; use leptos::{html::Input, prelude::*}; +use leptos_fetch::QueryClient; use reactive_stores::{ArcStore, Store}; use thiserror::Error; -use crate::{chat::MacawChat, client::Client, open_chats::OpenChatsPanel, state_store::StateStore, user::MacawUser}; +use crate::{chat::MacawChat, client::Client, open_chats::OpenChatsPanel, user::MacawUser}; #[derive(Clone, Debug, Error)] pub enum NewChatError { @@ -18,6 +19,17 @@ pub enum NewChatError { Db(#[from] CommandError), } +// TODO: remove +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()) +} + +async fn get_user(jid: BareJID) -> ArcStore { + let client: Client = use_context().expect("no client in context"); + ArcStore::new(client.get_user(jid).await.unwrap()) +} + #[component] pub fn NewChatWidget(set_open_new_chat: WriteSignal) -> impl IntoView { let jid = RwSignal::new("".to_string()); @@ -39,10 +51,7 @@ pub fn NewChatWidget(set_open_new_chat: WriteSignal) -> impl IntoView { use_context().expect("no open chats panel store in context"); let client = use_context::().expect("client not in context"); - let chat_state_store: StateStore> = - use_context().expect("no chat state store"); - let user_state_store: StateStore> = - use_context().expect("no user state store"); + let query_client: QueryClient = expect_context(); let open_chat = Action::new_local(move |_| { let client = client.clone(); @@ -77,10 +86,52 @@ pub fn NewChatWidget(set_open_new_chat: WriteSignal) -> impl IntoView { let chat = { // let user = MacawUser::got_user(user); - let user = user_state_store.store(user.jid.clone(), ArcStore::new(user)); - let user = MacawUser { user }; - let chat = chat_state_store.store(chat.correspondent.clone(), ArcStore::new(chat)); - MacawChat { chat, user } + 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 = { + let jid = user.jid.clone(); + let user_store = query_client.subscribe_value_local(get_user, move || jid.clone()); + if let Some(user_store) = user_store.get() { + user_store.set(user); + MacawUser { user: user_store } + } else { + let jid = user.jid.clone(); + let user_store = ArcStore::new(user); + query_client.set_query_local(get_user, jid, user_store.clone()); + MacawUser { + user: user_store, + } + } + + }; + MacawChat { 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 = { + let jid = user.jid.clone(); + let user_store = query_client.subscribe_value_local(get_user, move || jid.clone()); + if let Some(user_store) = user_store.get() { + user_store.set(user); + MacawUser { user: user_store } + } else { + let jid = user.jid.clone(); + let user_store = ArcStore::new(user); + query_client.set_query_local(get_user, jid, user_store.clone()); + MacawUser { + user: user_store, + } + } + + }; + MacawChat { + chat: chat_store, + user, + } + } }; open_chats.update(|open_chats| open_chats.open(chat.clone())); set_open_new_chat.set(false); -- cgit