diff options
Diffstat (limited to 'src/views/macaw.rs')
-rw-r--r-- | src/views/macaw.rs | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/src/views/macaw.rs b/src/views/macaw.rs index 328e3d2..4a5b794 100644 --- a/src/views/macaw.rs +++ b/src/views/macaw.rs @@ -1,4 +1,4 @@ -use std::collections::HashSet; +use std::collections::{HashMap, HashSet}; use filamento::{chat::{Chat, Message, MessageStoreFields}, user::User, UpdateMessage}; use jid::BareJID; @@ -10,7 +10,7 @@ use tokio::sync::mpsc::Receiver; use tracing::debug; use uuid::Uuid; -use crate::{client::Client, components::sidebar::Sidebar, contact::{ArcMacawContact, MacawContact}, message::{ArcMacawMessage, MacawMessage}, message_subscriptions::MessageSubscriptions, open_chats::OpenChatsPanel, roster::{Roster, RosterStoreFields}, state_store::StateStore, user::{ArcMacawUser, MacawUser}, user_presences::{Presences, UserPresences}}; +use crate::{client::Client, components::sidebar::Sidebar, contact::{ArcMacawContact, MacawContact}, message::{ArcMacawMessage, MacawMessage}, message_subscriptions::MessageSubscriptions, open_chats::OpenChatsPanel, roster::{Roster, RosterStoreFields}, state_store::StateStore, user::{fetch_avatar, ArcMacawUser, MacawUser}, user_presences::{Presences, UserPresences}}; use super::AppState; @@ -25,6 +25,7 @@ pub fn Macaw( mut updates: Receiver<UpdateMessage>, set_app: WriteSignal<AppState>, ) -> impl IntoView { + let (updates, set_updates) = signal(Some(updates)); provide_context(set_app); provide_context(client); @@ -38,7 +39,7 @@ pub fn Macaw( 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(); + let users_store: StateStore<BareJID, (ArcStore<User>, ArcRwSignal<String>)> = StateStore::new(); provide_context(users_store); let open_chats = Store::new(OpenChatsPanel::default()); @@ -53,7 +54,7 @@ pub fn Macaw( async move { let client = use_context::<Client>().expect("client not in context"); let user = client.get_user((*client.jid).clone()).await.unwrap(); - ArcMacawUser::got_user(user).into() + ArcMacawUser::got_user(user).await.into() } }); provide_context(client_user); @@ -65,19 +66,15 @@ pub fn Macaw( // TODO: get cached contacts on login before getting the updated contacts - OnceResource::new(async move { + LocalResource::new(move || async move { + let mut updates = set_updates.write().take().expect("main loop ran twice"); while let Some(update) = updates.recv().await { match update { UpdateMessage::Online(online, items) => { - let contacts = items - .into_iter() - .map(|(contact, user)| { - ( - contact.user_jid.clone(), - ArcMacawContact::got_contact_and_user(contact, user).into(), - ) - }) - .collect(); + let mut contacts = HashMap::new(); + for (contact, user) in items { + contacts.insert(contact.user_jid.clone(), ArcMacawContact::got_contact_and_user(contact, user).await.into()); + } roster.contacts().set(contacts); } UpdateMessage::Offline(offline) => { @@ -85,13 +82,13 @@ pub fn Macaw( user_presences.write().clear(); } UpdateMessage::RosterUpdate(contact, user) => { + let new_contact = ArcMacawContact::got_contact_and_user(contact.clone(), user).await.into(); roster.contacts().update(|roster| { if let Some(macaw_contact) = roster.get_mut(&contact.user_jid) { macaw_contact.set(contact); } else { let jid = contact.user_jid.clone(); - let contact = ArcMacawContact::got_contact_and_user(contact, user).into(); - roster.insert(jid, contact); + roster.insert(jid, new_contact); } }); } @@ -116,7 +113,7 @@ pub fn Macaw( } UpdateMessage::Message { to, from, message } => { debug!("before got message"); - let new_message = ArcMacawMessage::got_message_and_user(message, from); + let new_message = ArcMacawMessage::got_message_and_user(message, from).await; debug!("after got message"); spawn_local(async move { message_subscriptions @@ -136,12 +133,16 @@ pub fn Macaw( set_subscription_requests.update(|req| { req.insert(jid); }); } UpdateMessage::NickChanged { jid, nick } => { - users_store.modify(&jid, |user| { + users_store.modify(&jid, |(user, _avatar)| { user.update(|user| *&mut user.nick = nick.clone()) }); } UpdateMessage::AvatarChanged { jid, id } => { - users_store.modify(&jid, |user| *&mut user.write().avatar = id.clone()); + let new_avatar = fetch_avatar(id.as_deref()).await; + users_store.modify(&jid, |(user, avatar)| { + *&mut user.write().avatar = id.clone(); + *&mut avatar.set(new_avatar.clone()) + }); } } } |