diff options
Diffstat (limited to 'src/components')
-rw-r--r-- | src/components/chats_list.rs | 2 | ||||
-rw-r--r-- | src/components/message_history_buffer.rs | 2 | ||||
-rw-r--r-- | src/components/new_chat.rs | 69 | ||||
-rw-r--r-- | src/components/personal_status.rs | 2 | ||||
-rw-r--r-- | src/components/roster_list/contact_request_manager.rs | 3 |
5 files changed, 65 insertions, 13 deletions
diff --git a/src/components/chats_list.rs b/src/components/chats_list.rs index b8cf34c..d520f56 100644 --- a/src/components/chats_list.rs +++ b/src/components/chats_list.rs @@ -73,7 +73,7 @@ pub fn ChatsList() -> impl IntoView { debug!("set the new message"); }); on_cleanup(move || { - if let Some(sub_id) = sub_id.get() { + if let Some(sub_id) = sub_id.get_untracked() { new_messages_signal.write().unsubscribe_all(sub_id); } }); diff --git a/src/components/message_history_buffer.rs b/src/components/message_history_buffer.rs index 36439a8..632209d 100644 --- a/src/components/message_history_buffer.rs +++ b/src/components/message_history_buffer.rs @@ -123,7 +123,7 @@ pub fn MessageHistoryBuffer(chat: MacawChat) -> impl IntoView { if let Some(sub_id) = sub_id.get() { new_messages_signal .write() - .unsubscribe_chat(sub_id, chat_chat.correspondent().get()); + .unsubscribe_chat(sub_id, chat_chat.correspondent().get_untracked()); } }); 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<DatabaseError>), } +// TODO: remove +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()) +} + +async fn get_user(jid: BareJID) -> ArcStore<User> { + 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<bool>) -> impl IntoView { let jid = RwSignal::new("".to_string()); @@ -39,10 +51,7 @@ pub fn NewChatWidget(set_open_new_chat: WriteSignal<bool>) -> impl IntoView { use_context().expect("no open chats panel store in context"); let client = use_context::<Client>().expect("client not in context"); - let chat_state_store: StateStore<BareJID, ArcStore<Chat>> = - use_context().expect("no chat state store"); - let user_state_store: StateStore<BareJID, ArcStore<User>> = - 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<bool>) -> 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); diff --git a/src/components/personal_status.rs b/src/components/personal_status.rs index f830a1b..81a27b5 100644 --- a/src/components/personal_status.rs +++ b/src/components/personal_status.rs @@ -11,7 +11,7 @@ pub fn PersonalStatus() -> impl IntoView { let (open, set_open) = signal(false); move || if let Some(user) = user.get() { - let user: Store<User> = <ArcStore<filamento::user::User> as Clone>::clone(&(*user.user)).into(); + let user: Store<User> = <ArcStore<filamento::user::User> as Clone>::clone(&user.user).into(); view! { <div class="dock-item" class:focused=move || *open.read() on:click=move |_| { debug!("set open to true"); diff --git a/src/components/roster_list/contact_request_manager.rs b/src/components/roster_list/contact_request_manager.rs index 174e677..31dff91 100644 --- a/src/components/roster_list/contact_request_manager.rs +++ b/src/components/roster_list/contact_request_manager.rs @@ -109,7 +109,8 @@ pub fn AddContact() -> impl IntoView { let jid = jid.clone(); async move { // TODO: error - client.accept_buddy_request(jid).await; + client.accept_buddy_request(jid.clone()).await; + set_requests.write().remove(&jid); } }); |