From ce05e5de6461d95703e6c8c971638bcee484c5fe Mon Sep 17 00:00:00 2001 From: cel 🌸 Date: Sat, 24 May 2025 16:54:40 +0100 Subject: feat: log out button --- src/lib.rs | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) (limited to 'src/lib.rs') diff --git a/src/lib.rs b/src/lib.rs index 189d050..0f37441 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -115,17 +115,17 @@ impl DerefMut for Client { #[component] pub fn App() -> impl IntoView { let (app, set_app) = signal(AppState::LoggedOut); - let client: RwSignal)>> = RwSignal::new(None); + let (client, set_client) = signal(None::<(Client, Receiver)>); view! { {move || match &*app.read() { - AppState::LoggedOut => view! { }.into_any(), + AppState::LoggedOut => view! { }.into_any(), AppState::LoggedIn => { - if let Some((client, updates)) = client.write_untracked().take() { - view! { }.into_any() + if let Some((client, updates)) = set_client.write_untracked().take() { + view! { }.into_any() } else { set_app.set(AppState::LoggedOut); - view! { }.into_any() + view! { }.into_any() } } }} @@ -149,7 +149,7 @@ pub enum LoginError { #[component] fn LoginPage( set_app: WriteSignal, - set_client: RwSignal)>>, + set_client: WriteSignal)>>, ) -> impl IntoView { let jid = RwSignal::new("".to_string()); let password = RwSignal::new("".to_string()); @@ -615,7 +615,9 @@ fn Macaw( // app_state: WriteSignal)>, LocalStorage>, client: Client, mut updates: Receiver, + set_app: WriteSignal, ) -> impl IntoView { + provide_context(set_app); provide_context(client); let roster = Store::new(Roster::new()); @@ -923,10 +925,12 @@ pub fn PersonalStatus() -> impl IntoView { #[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().as_bare()).write().resource_presence(client.resource.read().clone().unwrap_or_default()).presence { PresenceType::Online(online) => match online.show { @@ -946,9 +950,15 @@ pub fn PersonalStatusMenu(user: Store, set_open: WriteSignal) -> imp 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 = client.clone(); + let client = client1.clone(); async move { if let Err(e) = match show_value { 0 => { @@ -1040,7 +1050,11 @@ pub fn PersonalStatusMenu(user: Store, set_open: WriteSignal) -> imp Settings
- -- cgit