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



                                                    
                                                                                                                                       

            
                                                             
                                                                                                    
                                                                                                               












                                                                             
                                                              










                                                                         
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, MacawUser}, 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>
    }
}