diff options
| author | 2025-05-24 16:54:40 +0100 | |
|---|---|---|
| committer | 2025-05-24 16:54:40 +0100 | |
| commit | ce05e5de6461d95703e6c8c971638bcee484c5fe (patch) | |
| tree | 3891975b0f84c2dd53fd80920b35953b966c6be9 | |
| parent | e823cafb1a659f4d35164eedb85d098271fca20a (diff) | |
| download | macaw-web-ce05e5de6461d95703e6c8c971638bcee484c5fe.tar.gz macaw-web-ce05e5de6461d95703e6c8c971638bcee484c5fe.tar.bz2 macaw-web-ce05e5de6461d95703e6c8c971638bcee484c5fe.zip  | |
feat: log out button
| -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>  | 
