summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-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>