diff options
Diffstat (limited to 'src/views/macaw.rs')
-rw-r--r-- | src/views/macaw.rs | 51 |
1 files changed, 33 insertions, 18 deletions
diff --git a/src/views/macaw.rs b/src/views/macaw.rs index 18e0ad3..e6ec66c 100644 --- a/src/views/macaw.rs +++ b/src/views/macaw.rs @@ -1,8 +1,9 @@ use std::collections::HashSet; -use filamento::{chat::{Chat, Message, MessageStoreFields}, user::User, UpdateMessage}; +use filamento::{chat::{Chat, Message, MessageStoreFields}, user::{User, UserStoreFields}, UpdateMessage}; use jid::BareJID; use leptos::{prelude::*, task::spawn_local}; +use leptos_fetch::QueryClient; use open_chats_panel::OpenChatsPanelView; use reactive_stores::{ArcStore, Store}; use settings::{Settings, SettingsPage}; @@ -10,13 +11,25 @@ use tokio::sync::mpsc::Receiver; use tracing::debug; use uuid::Uuid; -use crate::{client::Client, components::sidebar::Sidebar, contact::MacawContact, message::MacawMessage, message_subscriptions::MessageSubscriptions, open_chats::OpenChatsPanel, roster::{Roster, RosterStoreFields}, state_store::StateStore, user::MacawUser, user_presences::{Presences, UserPresences}}; +use crate::{client::Client, components::sidebar::Sidebar, contact::MacawContact, message::MacawMessage, message_subscriptions::MessageSubscriptions, open_chats::OpenChatsPanel, roster::{Roster, RosterStoreFields}, user::MacawUser, user_presences::{Presences, UserPresences}}; use super::AppState; pub mod settings; mod open_chats_panel; +// TODO: remove +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()) +} + +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 Macaw( // TODO: logout @@ -34,12 +47,8 @@ pub fn Macaw( let message_subscriptions = RwSignal::new(MessageSubscriptions::new()); provide_context(message_subscriptions); - let messages_store: StateStore<Uuid, ArcStore<Message>> = StateStore::new(); - provide_context(messages_store); - let chats_store: StateStore<BareJID, ArcStore<Chat>> = StateStore::new(); - provide_context(chats_store); - let users_store: StateStore<BareJID, ArcStore<User>> = StateStore::new(); - provide_context(users_store); + QueryClient::new().provide(); + let query_client: QueryClient = expect_context(); let open_chats = Store::new(OpenChatsPanel::default()); provide_context(open_chats); @@ -102,7 +111,7 @@ pub fn Macaw( } UpdateMessage::Presence { from, presence } => { let bare_jid = from.to_bare(); - if let Some(presences) = user_presences.read().user_presences.get(&bare_jid) { + if let Some(presences) = user_presences.read_untracked().user_presences.get(&bare_jid) { if let Some(resource) = from.resourcepart() { presences.write().update_presence(resource.clone(), presence); } @@ -127,22 +136,28 @@ pub fn Macaw( debug!("after set message"); } UpdateMessage::MessageDelivery { id, chat, delivery } => { - messages_store.modify(&id, |message| { - <ArcStore<filamento::chat::Message> as Clone>::clone(&message) - .delivery() - .set(Some(delivery)) - }); + query_client.update_query(get_message, id, |message| { + if let Some(message) = message { + <ArcStore<filamento::chat::Message> as Clone>::clone(&message).delivery().set(Some(delivery)) + } + }) } UpdateMessage::SubscriptionRequest(jid) => { set_subscription_requests.update(|req| { req.insert(jid); }); } UpdateMessage::NickChanged { jid, nick } => { - users_store.modify(&jid, |user| { - user.update(|user| *&mut user.nick = nick.clone()) - }); + query_client.update_query(get_user, jid, |user| { + if let Some(user) = user { + <ArcStore<filamento::user::User> as Clone>::clone(&user).nick().set(nick) + } + }) } UpdateMessage::AvatarChanged { jid, id } => { - users_store.modify(&jid, |user| *&mut user.write().avatar = id.clone()); + query_client.update_query(get_user, jid, |user| { + if let Some(user) = user { + <ArcStore<filamento::user::User> as Clone>::clone(&user).avatar().set(id) + } + }) } } } |