diff --git a/assets/icons/device.svg b/assets/icons/device.svg
new file mode 100644
index 0000000..8c54aef
--- /dev/null
+++ b/assets/icons/device.svg
@@ -0,0 +1,3 @@
+
diff --git a/assets/icons/scan.svg b/assets/icons/scan.svg
new file mode 100644
index 0000000..489cb12
--- /dev/null
+++ b/assets/icons/scan.svg
@@ -0,0 +1,3 @@
+
diff --git a/crates/chat/src/lib.rs b/crates/chat/src/lib.rs
index d6f0f45..9225b5d 100644
--- a/crates/chat/src/lib.rs
+++ b/crates/chat/src/lib.rs
@@ -113,7 +113,7 @@ impl ChatRegistry {
subscriptions.push(
// Observe the nip65 state and load chat rooms on every state change
cx.observe(&nostr, |this, state, cx| {
- match state.read(cx).relay_list_state() {
+ match state.read(cx).relay_list_state {
RelayState::Idle => {
this.reset(cx);
}
diff --git a/crates/chat_ui/src/lib.rs b/crates/chat_ui/src/lib.rs
index e7f078d..975edab 100644
--- a/crates/chat_ui/src/lib.rs
+++ b/crates/chat_ui/src/lib.rs
@@ -876,7 +876,7 @@ impl ChatPanel {
window.open_modal(cx, move |this, _window, cx| {
this.show_close(true)
.title(SharedString::from("Sent Reports"))
- .child(v_flex().pb_4().gap_4().children({
+ .child(v_flex().pb_2().gap_4().children({
let mut items = Vec::with_capacity(reports.len());
for report in reports.iter() {
diff --git a/crates/coop/src/dialogs/accounts.rs b/crates/coop/src/dialogs/accounts.rs
new file mode 100644
index 0000000..460f288
--- /dev/null
+++ b/crates/coop/src/dialogs/accounts.rs
@@ -0,0 +1,187 @@
+use anyhow::Error;
+use gpui::prelude::FluentBuilder;
+use gpui::{
+ div, px, App, AppContext, Context, Entity, InteractiveElement, IntoElement, ParentElement,
+ Render, SharedString, StatefulInteractiveElement, Styled, Subscription, Task, Window,
+};
+use nostr_sdk::prelude::*;
+use person::PersonRegistry;
+use state::{NostrRegistry, SignerEvent};
+use theme::ActiveTheme;
+use ui::avatar::Avatar;
+use ui::button::{Button, ButtonVariants};
+use ui::{h_flex, v_flex, Icon, IconName, Sizable, WindowExtension};
+
+use crate::dialogs::connect::ConnectSigner;
+use crate::dialogs::import::ImportKey;
+
+pub fn init(window: &mut Window, cx: &mut App) -> Entity {
+ cx.new(|cx| AccountSelector::new(window, cx))
+}
+
+/// Account selector
+pub struct AccountSelector {
+ /// The error message displayed when an error occurs.
+ error: Entity