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