use filamento::{presence::{Offline, Online, PresenceType, Show}, user::{User, UserStoreFields}}; use leptos::{html, prelude::*}; use reactive_stores::{ArcStore, Store}; use tracing::{debug, error}; use crate::{client::Client, components::{avatar::AvatarWithPresence, overlay::Overlay}, user::{get_name, MacawUser}, user_presences::UserPresences, views::{macaw::settings::SettingsPage, AppState}}; #[component] pub fn PersonalStatus() -> impl IntoView { let user: LocalResource = use_context().expect("no local user in context"); let (open, set_open) = signal(false); move || if let Some(user) = user.get() { view! {
{move || { let open = open.get(); debug!("open = {:?}", open); if open { view! { }.into_any() } else { view! {}.into_any() }}} }.into_any() } else { view! {}.into_any() } } #[component] pub fn PersonalStatusMenu(user: Store, set_open: WriteSignal) -> impl IntoView { let set_app: WriteSignal = use_context().unwrap(); let show_settings: RwSignal> = use_context().unwrap(); let user_presences: Store = use_context().expect("no user presence store"); let client = use_context::().expect("client not in context"); let client1 = client.clone(); let (show_value, set_show_value) = signal({ let show = match user_presences.write().get_user_presences(&user.jid().read()).write().resource_presence(client.resource.read().clone().unwrap_or_default()).presence { PresenceType::Online(online) => match online.show { Some(s) => match s { Show::Away => 3, Show::Chat => 0, Show::DoNotDisturb => 2, Show::ExtendedAway => 4, }, None => 1, }, PresenceType::Offline(_offline) => 5, }; debug!("initial show = {show}"); show }); let show_select: NodeRef = NodeRef::new(); let disconnect = Action::new_local(move |()| { let client = client.clone(); async move { client.disconnect(Offline::default()).await; } }); let set_status = Action::new_local(move |show_value: &i32| { let show_value = show_value.to_owned(); let client = client1.clone(); async move { if let Err(e) = match show_value { 0 => { if let Ok(r) = client.connect().await { client.resource.set(Some(r)) }; client.set_status(Online { show: Some(Show::Chat), ..Default::default() }).await }, 1 => { if let Ok(r) = client.connect().await { client.resource.set(Some(r)) }; client.set_status(Online { show: None, ..Default::default() }).await }, 2 => { if let Ok(r) = client.connect().await { client.resource.set(Some(r)) }; client.set_status(Online { show: Some(Show::DoNotDisturb), ..Default::default() }).await }, 3 => { if let Ok(r) = client.connect().await { client.resource.set(Some(r)) }; client.set_status(Online { show: Some(Show::Away), ..Default::default() }).await }, 4 => { if let Ok(r) = client.connect().await { client.resource.set(Some(r)) }; client.set_status(Online { show: Some(Show::ExtendedAway), ..Default::default() }).await }, 5 => { if let Ok(_) = client.disconnect(Offline::default()).await { client.resource.set(None) } set_show_value.set(5); return } _ => { error!("invalid availability select"); return } } { error!("show set error: {e}"); return } set_show_value.set(show_value); } }); view! { } }