summaryrefslogtreecommitdiffstats
path: root/src/views/macaw.rs
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@bunny.garden>2025-06-07 17:36:22 +0100
committerLibravatar cel 🌸 <cel@bunny.garden>2025-06-07 17:36:22 +0100
commit36e87b708ed3a2b0d6f2e932509b0fdf10fe0089 (patch)
tree5f3fc5a3d863f52a82a204a7746532202103d7cc /src/views/macaw.rs
parent4a5aa6579f5184c443ffbe80ce93e0daa0926826 (diff)
downloadmacaw-web-36e87b708ed3a2b0d6f2e932509b0fdf10fe0089.tar.gz
macaw-web-36e87b708ed3a2b0d6f2e932509b0fdf10fe0089.tar.bz2
macaw-web-36e87b708ed3a2b0d6f2e932509b0fdf10fe0089.zip
fix: avatar flashing from avatar loadHEADmain
Diffstat (limited to 'src/views/macaw.rs')
-rw-r--r--src/views/macaw.rs39
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())
+ });
}
}
}