diff options
Diffstat (limited to 'src/views')
| -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()) +                    });                  }              }          }  | 
