blob: 7ab75443d3ee69f523b8207bb61fe563e0d30026 (
plain) (
tree)
|
|
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>
}
}
|