From 36e87b708ed3a2b0d6f2e932509b0fdf10fe0089 Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Sat, 7 Jun 2025 17:36:22 +0100 Subject: fix: avatar flashing from avatar load --- src/chat.rs | 4 +- src/components/avatar.rs | 9 ++-- src/components/chat_header.rs | 3 +- src/components/chats_list.rs | 22 ++++----- src/components/chats_list/chats_list_item.rs | 3 +- src/components/message.rs | 3 +- src/components/message_history_buffer.rs | 13 ++--- src/components/new_chat.rs | 15 ++++-- src/components/personal_status.rs | 12 ++--- src/components/roster_list.rs | 7 ++- src/components/roster_list/roster_list_item.rs | 62 +++++++++++++++++------ src/contact.rs | 4 +- src/message.rs | 4 +- src/state_store.rs | 68 ++++++++++++++++---------- src/user.rs | 45 +++++++++++++---- src/views/macaw.rs | 39 ++++++++------- 16 files changed, 193 insertions(+), 120 deletions(-) (limited to 'src') diff --git a/src/chat.rs b/src/chat.rs index 29e2641..f4202f6 100644 --- a/src/chat.rs +++ b/src/chat.rs @@ -59,11 +59,11 @@ pub struct ArcMacawChat { } impl ArcMacawChat { - pub fn got_chat_and_user(chat: Chat, user: User) -> Self { + pub async fn got_chat_and_user(chat: Chat, user: User) -> Self { let chat_state_store: StateStore> = use_context().expect("no chat state store"); let chat = chat_state_store.store(chat.correspondent.clone(), ArcStore::new(chat)); - let user = ArcMacawUser::got_user(user); + let user = ArcMacawUser::got_user(user).await; Self { chat, user } } } diff --git a/src/components/avatar.rs b/src/components/avatar.rs index 9265ef7..292173e 100644 --- a/src/components/avatar.rs +++ b/src/components/avatar.rs @@ -2,13 +2,12 @@ use filamento::{presence::PresenceType, user::User}; use leptos::prelude::*; use reactive_stores::Store; -use crate::{components::icon::{show_to_icon, IconComponent}, icon::Icon, user::get_avatar, user_presences::UserPresences}; +use crate::{components::icon::{show_to_icon, IconComponent}, icon::Icon, user::{get_avatar, MacawUser}, user_presences::UserPresences}; #[component] -pub fn AvatarWithPresence(user: Store) -> impl IntoView { - let avatar = LocalResource::new(move || get_avatar(user)); +pub fn AvatarWithPresence(user: MacawUser) -> impl IntoView { let user_presences: Store = use_context().expect("no user presences in context"); - let presence = move || user_presences.write().get_user_presences(&user.read().jid).read().presence(); + let presence = move || user_presences.write().get_user_presences(&user.get().read().jid).read().presence(); let show_icon = move || presence().map(|(_, presence)| { match presence.presence { PresenceType::Online(online) => if let Some(show) = online.show { @@ -22,7 +21,7 @@ pub fn AvatarWithPresence(user: Store) -> impl IntoView { view! {
- + {move || if let Some(icon) = show_icon() { view!{ diff --git a/src/components/chat_header.rs b/src/components/chat_header.rs index 51906aa..fe4e8d9 100644 --- a/src/components/chat_header.rs +++ b/src/components/chat_header.rs @@ -12,9 +12,8 @@ pub fn ChatViewHeader(chat: MacawChat) -> impl IntoView { view! {
{move || { - let user = chat.user.get().into(); view! { - + } }}