diff --git a/crates/coop/src/chatspace.rs b/crates/coop/src/chatspace.rs index c0889b8..90b33f2 100644 --- a/crates/coop/src/chatspace.rs +++ b/crates/coop/src/chatspace.rs @@ -111,55 +111,9 @@ impl ChatSpace { subscriptions.push(cx.observe_in( &client_keys, window, - |_this: &mut Self, state, window, cx| { + |this: &mut Self, state, window, cx| { if !state.read(cx).has_keys() { - let title = SharedString::new(t!("startup.client_keys_warning")); - let desc = SharedString::new(t!("startup.client_keys_desc")); - - window.open_modal(cx, move |this, _window, cx| { - this.overlay_closable(false) - .show_close(false) - .keyboard(false) - .confirm() - .button_props( - ModalButtonProps::default() - .cancel_text(t!("startup.create_new_keys")) - .ok_text(t!("common.allow")), - ) - .child( - div() - .w_full() - .h_40() - .flex() - .flex_col() - .gap_1() - .items_center() - .justify_center() - .text_center() - .text_sm() - .child( - div() - .font_semibold() - .text_color(cx.theme().text_muted) - .child(title.clone()), - ) - .child(desc.clone()), - ) - .on_cancel(|_, _window, cx| { - ClientKeys::global(cx).update(cx, |this, cx| { - this.new_keys(cx); - }); - // true: Close modal - true - }) - .on_ok(|_, window, cx| { - ClientKeys::global(cx).update(cx, |this, cx| { - this.load(window, cx); - }); - // true: Close modal - true - }) - }); + this.render_client_keys_modal(window, cx); } }, )); @@ -301,8 +255,13 @@ impl ChatSpace { } fn on_sign_out(&mut self, _ev: &Logout, window: &mut Window, cx: &mut Context) { + let registry = Registry::global(cx); let identity = Identity::global(cx); - // TODO: save current session? + + registry.update(cx, |this, cx| { + this.reset(cx); + }); + identity.update(cx, |this, cx| { this.unload(window, cx); }); @@ -326,6 +285,56 @@ impl ChatSpace { }); } + fn render_client_keys_modal(&mut self, window: &mut Window, cx: &mut Context) { + let title = SharedString::new(t!("startup.client_keys_warning")); + let desc = SharedString::new(t!("startup.client_keys_desc")); + + window.open_modal(cx, move |this, _window, cx| { + this.overlay_closable(false) + .show_close(false) + .keyboard(false) + .confirm() + .button_props( + ModalButtonProps::default() + .cancel_text(t!("startup.create_new_keys")) + .ok_text(t!("common.allow")), + ) + .child( + div() + .w_full() + .h_40() + .flex() + .flex_col() + .gap_1() + .items_center() + .justify_center() + .text_center() + .text_sm() + .child( + div() + .font_semibold() + .text_color(cx.theme().text_muted) + .child(title.clone()), + ) + .child(desc.clone()), + ) + .on_cancel(|_, _window, cx| { + ClientKeys::global(cx).update(cx, |this, cx| { + this.new_keys(cx); + }); + // true: Close modal + true + }) + .on_ok(|_, window, cx| { + ClientKeys::global(cx).update(cx, |this, cx| { + this.load(window, cx); + }); + // true: Close modal + true + }) + }); + } + fn render_titlebar_left_side( &mut self, _window: &mut Window, diff --git a/crates/coop/src/main.rs b/crates/coop/src/main.rs index 884055f..c77c976 100644 --- a/crates/coop/src/main.rs +++ b/crates/coop/src/main.rs @@ -358,8 +358,6 @@ async fn handle_nostr_notifications( let client = nostr_client(); let auto_close = SubscribeAutoCloseOptions::default().exit_policy(ReqExitPolicy::ExitOnEOSE); let mut notifications = client.notifications(); - let mut processed_relay_list = false; - let mut processed_inbox_relay = false; while let Ok(notification) = notifications.recv().await { let RelayPoolNotification::Message { message, .. } = notification else { @@ -379,11 +377,6 @@ async fn handle_nostr_notifications( Kind::RelayList => { // Get metadata for event's pubkey that matches the current user's pubkey if let Ok(true) = is_from_current_user(&event).await { - match processed_relay_list { - true => continue, - false => processed_relay_list = true, - } - let sub_id = SubscriptionId::new("metadata"); let filter = Filter::new() .kinds(vec![Kind::Metadata, Kind::ContactList, Kind::InboxRelays]) @@ -398,11 +391,6 @@ async fn handle_nostr_notifications( } Kind::InboxRelays => { if let Ok(true) = is_from_current_user(&event).await { - match processed_inbox_relay { - true => continue, - false => processed_inbox_relay = true, - } - // Get all inbox relays let relays = event .tags @@ -423,8 +411,6 @@ async fn handle_nostr_notifications( _ = client.connect_relay(relay).await; } - log::info!("Connected to messaging relays"); - let filter = Filter::new().kind(Kind::GiftWrap).pubkey(event.pubkey); let sub_id = SubscriptionId::new("gift-wrap"); @@ -436,7 +422,7 @@ async fn handle_nostr_notifications( .await .is_ok() { - log::info!("Subscribing to gift wrap events in: {relays:?}"); + log::info!("Subscribing to messages in: {relays:?}"); } } } diff --git a/crates/global/src/lib.rs b/crates/global/src/lib.rs index d7ef10a..028ead0 100644 --- a/crates/global/src/lib.rs +++ b/crates/global/src/lib.rs @@ -54,9 +54,9 @@ pub fn nostr_client() -> &'static Client { .gossip(true) .automatic_authentication(true) .verify_subscriptions(false) - // Sleep after idle for 20 seconds + // Sleep after idle for 30 seconds .sleep_when_idle(SleepWhenIdle::Enabled { - timeout: Duration::from_secs(20), + timeout: Duration::from_secs(30), }); ClientBuilder::default().database(lmdb).opts(opts).build() diff --git a/crates/identity/src/lib.rs b/crates/identity/src/lib.rs index 8d973f3..044b3fe 100644 --- a/crates/identity/src/lib.rs +++ b/crates/identity/src/lib.rs @@ -127,8 +127,9 @@ impl Identity { .kind(Kind::ApplicationSpecificData) .identifier(ACCOUNT_D); - // Unset signer + // Reset the nostr client client.unset_signer().await; + client.unsubscribe_all().await; // Delete account client.database().delete(filter).await?; @@ -257,7 +258,7 @@ impl Identity { this.set_public_key(None, window, cx); }) .ok(); - // Close modal + // true to close the modal true }) .on_ok(move |_, window, cx| { @@ -271,7 +272,7 @@ impl Identity { this.verify_keys(enc, password, weak_error, window, cx); }) .ok(); - + // false to keep the modal open false }) .child( @@ -321,25 +322,33 @@ impl Identity { } // Decrypt the password in the background to prevent blocking the main thread - let task: Task> = - cx.background_spawn(async move { enc.decrypt(&password).ok() }); + let task: Task> = cx.background_spawn(async move { + let secret = enc.decrypt(&password)?; + Ok(secret) + }); cx.spawn_in(window, async move |this, cx| { - if let Some(secret) = task.await { - cx.update(|window, cx| { - window.close_modal(cx); - // Update user's signer with decrypted secret key - this.update(cx, |this, cx| { - this.set_signer(Keys::new(secret), window, cx); + match task.await { + Ok(secret) => { + cx.update(|window, cx| { + this.update(cx, |this, cx| { + // Update user's signer with decrypted secret key + this.set_signer(Keys::new(secret), window, cx); + // Close the current modal + window.close_modal(cx); + }) + .ok(); }) .ok(); - }) - .ok(); - } else { - _ = error.update(cx, |this, cx| { - *this = Some("Invalid password".into()); - cx.notify(); - }); + } + Err(e) => { + error + .update(cx, |this, cx| { + *this = Some(e.to_string().into()); + cx.notify(); + }) + .ok(); + } } }) .detach(); @@ -597,15 +606,12 @@ async fn get_nip65_relays(public_key: PublicKey) -> Result<(), Error> { let client = nostr_client(); let opts = SubscribeAutoCloseOptions::default().exit_policy(ReqExitPolicy::ExitOnEOSE); let sub_id = SubscriptionId::new("nip65-relays"); - let filter = Filter::new() .kind(Kind::RelayList) .author(public_key) .limit(1); - if client.subscription(&sub_id).await.is_empty() { - client.subscribe_with_id(sub_id, filter, Some(opts)).await?; - } + client.subscribe_with_id(sub_id, filter, Some(opts)).await?; Ok(()) } diff --git a/crates/registry/src/lib.rs b/crates/registry/src/lib.rs index 705de7d..ab15afa 100644 --- a/crates/registry/src/lib.rs +++ b/crates/registry/src/lib.rs @@ -101,6 +101,12 @@ impl Registry { } } + pub fn reset(&mut self, cx: &mut Context) { + self.rooms = vec![]; + self.loading = true; + cx.notify(); + } + pub(crate) fn set_persons_from_task( &mut self, task: Task, Error>>,