blob: 292173e2689a45b60f2320fa33b6a6cdf615b91c (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
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>
}
}
|