summaryrefslogblamecommitdiffstats
path: root/src/components/avatar.rs
blob: 7ab75443d3ee69f523b8207bb61fe563e0d30026 (plain) (tree)
1
2
3
4
5
6
7
8
9
10



                                                    





                                                    

            
                                                             
                                                                                                    




















                                                          


                                          







                                                                                                  


              
use filamento::{presence::PresenceType, user::User};
use leptos::prelude::*;
use reactive_stores::Store;

use crate::{
    components::icon::{IconComponent, show_to_icon},
    icon::Icon,
    user::{MacawUser, get_avatar},
    user_presences::UserPresences,
};

#[component]
pub fn AvatarWithPresence(user: MacawUser) -> impl IntoView {
    let user_presences: Store<UserPresences> = use_context().expect("no user presences in context");
    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 {
                        Some(show_to_icon(show))
                    } else {
                        Some(Icon::Available16Color)
                    }
                }
                PresenceType::Offline(offline) => None,
            })
            .unwrap_or_default()
    };

    view! {
        <div class="avatar-with-presence">
            <img class="avatar" src=move || user.avatar().get() />
            {move || {
                if let Some(icon) = show_icon() {
                    view! { <IconComponent icon=icon class:presence-show-icon=true /> }.into_any()
                } else {
                    view! {}.into_any()
                }
            }}
        </div>
    }
}