summaryrefslogtreecommitdiffstats
path: root/src/lib.rs
diff options
context:
space:
mode:
authorLibravatar cel 🌸 <cel@bunny.garden>2025-05-24 16:54:40 +0100
committerLibravatar cel 🌸 <cel@bunny.garden>2025-05-24 16:54:40 +0100
commitce05e5de6461d95703e6c8c971638bcee484c5fe (patch)
tree3891975b0f84c2dd53fd80920b35953b966c6be9 /src/lib.rs
parente823cafb1a659f4d35164eedb85d098271fca20a (diff)
downloadmacaw-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.rs30
1 files changed, 22 insertions, 8 deletions
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<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>