diff options
author | 2025-05-24 16:54:40 +0100 | |
---|---|---|
committer | 2025-05-24 16:54:40 +0100 | |
commit | ce05e5de6461d95703e6c8c971638bcee484c5fe (patch) | |
tree | 3891975b0f84c2dd53fd80920b35953b966c6be9 /src/lib.rs | |
parent | e823cafb1a659f4d35164eedb85d098271fca20a (diff) | |
download | macaw-web-ce05e5de6461d95703e6c8c971638bcee484c5fe.tar.gz macaw-web-ce05e5de6461d95703e6c8c971638bcee484c5fe.tar.bz2 macaw-web-ce05e5de6461d95703e6c8c971638bcee484c5fe.zip |
feat: log out button
Diffstat (limited to 'src/lib.rs')
-rw-r--r-- | src/lib.rs | 30 |
1 files changed, 22 insertions, 8 deletions
@@ -115,17 +115,17 @@ impl DerefMut for Client { #[component] pub fn App() -> impl IntoView { let (app, set_app) = signal(AppState::LoggedOut); - let client: RwSignal<Option<(Client, Receiver<UpdateMessage>)>> = RwSignal::new(None); + let (client, set_client) = signal(None::<(Client, Receiver<UpdateMessage>)>); view! { {move || match &*app.read() { - AppState::LoggedOut => view! { <LoginPage set_app set_client=client /> }.into_any(), + AppState::LoggedOut => view! { <LoginPage set_app set_client /> }.into_any(), AppState::LoggedIn => { - if let Some((client, updates)) = client.write_untracked().take() { - view! { <Macaw client updates /> }.into_any() + if let Some((client, updates)) = set_client.write_untracked().take() { + view! { <Macaw client updates set_app /> }.into_any() } else { set_app.set(AppState::LoggedOut); - view! { <LoginPage set_app set_client=client /> }.into_any() + view! { <LoginPage set_app set_client /> }.into_any() } } }} @@ -149,7 +149,7 @@ pub enum LoginError { #[component] fn LoginPage( set_app: WriteSignal<AppState>, - set_client: RwSignal<Option<(Client, Receiver<UpdateMessage>)>>, + set_client: WriteSignal<Option<(Client, Receiver<UpdateMessage>)>>, ) -> impl IntoView { let jid = RwSignal::new("".to_string()); let password = RwSignal::new("".to_string()); @@ -615,7 +615,9 @@ fn Macaw( // app_state: WriteSignal<Option<essage>)>, LocalStorage>, client: Client, mut updates: Receiver<UpdateMessage>, + set_app: WriteSignal<AppState>, ) -> 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<User>, set_open: WriteSignal<bool>) -> impl IntoView { + let set_app: WriteSignal<AppState> = use_context().unwrap(); let show_settings: RwSignal<Option<SettingsPage>> = use_context().unwrap(); let user_presences: Store<UserPresences> = use_context().expect("no user presence store"); let client = use_context::<Client>().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<User>, set_open: WriteSignal<bool>) -> imp let show_select: NodeRef<html::Select> = 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<User>, set_open: WriteSignal<bool>) -> imp Settings </div> <hr /> - <div class="menu-item"> + <div class="menu-item" on:click=move |_| { + // TODO: check if client is actually dropped/shutdown eventually + disconnect.dispatch(()); + set_app.set(AppState::LoggedOut) + }> Log out </div> </div> |