summaryrefslogblamecommitdiffstats
path: root/src/components/avatar.rs
blob: 9265ef744acb0a316247406acea1735b9d9d081e (plain) (tree)



































                                                                                                                          
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};

#[component]
pub fn AvatarWithPresence(user: Store<User>) -> impl IntoView {
    let avatar = LocalResource::new(move || get_avatar(user));
    let user_presences: Store<UserPresences> = use_context().expect("no user presences in context");
    let presence = move || user_presences.write().get_user_presences(&user.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 || 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>
    }
}