diff --git a/Cargo.lock b/Cargo.lock index 09cc9ef..7629c2b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -458,8 +458,9 @@ dependencies = [ [[package]] name = "async-wsocket" -version = "0.11.0" -source = "git+https://github.com/yukibtc/async-wsocket?rev=259c0bc372e7d60d94827b484178bf995afdcbe6#259c0bc372e7d60d94827b484178bf995afdcbe6" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34d2efbc332d581321b37a3012c942b0555483030b5cfc1325a95c386b11e27b" dependencies = [ "async-utility", "futures", @@ -1140,7 +1141,7 @@ dependencies = [ [[package]] name = "collections" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#344284e01331667c018e6ade5d791a20598a3a5c" +source = "git+https://github.com/zed-industries/zed#eedbede939b76debb4b4fb6fe3fe8f8fe4ce2ee4" dependencies = [ "rustc-hash 1.1.0", ] @@ -1476,7 +1477,7 @@ dependencies = [ [[package]] name = "derive_refineable" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#344284e01331667c018e6ade5d791a20598a3a5c" +source = "git+https://github.com/zed-industries/zed#eedbede939b76debb4b4fb6fe3fe8f8fe4ce2ee4" dependencies = [ "proc-macro2", "quote", @@ -2188,7 +2189,7 @@ dependencies = [ [[package]] name = "gpui" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#344284e01331667c018e6ade5d791a20598a3a5c" +source = "git+https://github.com/zed-industries/zed#eedbede939b76debb4b4fb6fe3fe8f8fe4ce2ee4" dependencies = [ "anyhow", "as-raw-xcb-connection", @@ -2273,7 +2274,7 @@ dependencies = [ [[package]] name = "gpui_macros" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#344284e01331667c018e6ade5d791a20598a3a5c" +source = "git+https://github.com/zed-industries/zed#eedbede939b76debb4b4fb6fe3fe8f8fe4ce2ee4" dependencies = [ "proc-macro2", "quote", @@ -2484,7 +2485,7 @@ dependencies = [ [[package]] name = "http_client" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#344284e01331667c018e6ade5d791a20598a3a5c" +source = "git+https://github.com/zed-industries/zed#eedbede939b76debb4b4fb6fe3fe8f8fe4ce2ee4" dependencies = [ "anyhow", "bytes", @@ -3089,7 +3090,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "536e7c782167a2d48346ca0b2677fad19eaef20f19a4ab868e4d5b96ca879def" dependencies = [ "bech32", - "reqwest 0.12.11", + "reqwest 0.12.12", "serde", "serde_json", ] @@ -3161,7 +3162,7 @@ dependencies = [ [[package]] name = "media" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#344284e01331667c018e6ade5d791a20598a3a5c" +source = "git+https://github.com/zed-industries/zed#eedbede939b76debb4b4fb6fe3fe8f8fe4ce2ee4" dependencies = [ "anyhow", "bindgen", @@ -3329,8 +3330,8 @@ checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" [[package]] name = "nostr" -version = "0.37.0" -source = "git+https://github.com/rust-nostr/nostr#5ef7353789d54931b664639c11df1aa22e9aa37c" +version = "0.38.0" +source = "git+https://github.com/rust-nostr/nostr#6ccc81ad3b8d9de10d14f2699db09a4c72660e6c" dependencies = [ "aes", "async-trait", @@ -3347,7 +3348,7 @@ dependencies = [ "negentropy 0.3.1", "negentropy 0.4.3", "once_cell", - "reqwest 0.12.11", + "reqwest 0.12.12", "scrypt", "serde", "serde_json", @@ -3360,8 +3361,8 @@ dependencies = [ [[package]] name = "nostr-database" -version = "0.37.0" -source = "git+https://github.com/rust-nostr/nostr#5ef7353789d54931b664639c11df1aa22e9aa37c" +version = "0.38.0" +source = "git+https://github.com/rust-nostr/nostr#6ccc81ad3b8d9de10d14f2699db09a4c72660e6c" dependencies = [ "async-trait", "flatbuffers", @@ -3371,8 +3372,8 @@ dependencies = [ [[package]] name = "nostr-lmdb" -version = "0.37.0" -source = "git+https://github.com/rust-nostr/nostr#5ef7353789d54931b664639c11df1aa22e9aa37c" +version = "0.38.0" +source = "git+https://github.com/rust-nostr/nostr#6ccc81ad3b8d9de10d14f2699db09a4c72660e6c" dependencies = [ "async-utility", "heed", @@ -3383,8 +3384,8 @@ dependencies = [ [[package]] name = "nostr-relay-pool" -version = "0.37.0" -source = "git+https://github.com/rust-nostr/nostr#5ef7353789d54931b664639c11df1aa22e9aa37c" +version = "0.38.0" +source = "git+https://github.com/rust-nostr/nostr#6ccc81ad3b8d9de10d14f2699db09a4c72660e6c" dependencies = [ "async-utility", "async-wsocket", @@ -3399,8 +3400,8 @@ dependencies = [ [[package]] name = "nostr-sdk" -version = "0.37.0" -source = "git+https://github.com/rust-nostr/nostr#5ef7353789d54931b664639c11df1aa22e9aa37c" +version = "0.38.0" +source = "git+https://github.com/rust-nostr/nostr#6ccc81ad3b8d9de10d14f2699db09a4c72660e6c" dependencies = [ "async-utility", "lnurl-pay", @@ -3415,8 +3416,8 @@ dependencies = [ [[package]] name = "nostr-zapper" -version = "0.37.0" -source = "git+https://github.com/rust-nostr/nostr#5ef7353789d54931b664639c11df1aa22e9aa37c" +version = "0.38.0" +source = "git+https://github.com/rust-nostr/nostr#6ccc81ad3b8d9de10d14f2699db09a4c72660e6c" dependencies = [ "async-trait", "nostr", @@ -4435,7 +4436,7 @@ dependencies = [ [[package]] name = "refineable" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#344284e01331667c018e6ade5d791a20598a3a5c" +source = "git+https://github.com/zed-industries/zed#eedbede939b76debb4b4fb6fe3fe8f8fe4ce2ee4" dependencies = [ "derive_refineable", ] @@ -4518,9 +4519,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.12.11" +version = "0.12.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe060fe50f524be480214aba758c71f99f90ee8c83c5a36b5e9e1d568eb4eb3" +checksum = "43e734407157c3c2034e0258f5e4473ddb361b1e85f95a66690d67264d7cd1da" dependencies = [ "base64", "bytes", @@ -4563,7 +4564,7 @@ dependencies = [ [[package]] name = "reqwest_client" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#344284e01331667c018e6ade5d791a20598a3a5c" +source = "git+https://github.com/zed-industries/zed#eedbede939b76debb4b4fb6fe3fe8f8fe4ce2ee4" dependencies = [ "anyhow", "bytes", @@ -4959,7 +4960,7 @@ checksum = "c2fdfc24bc566f839a2da4c4295b82db7d25a24253867d5c64355abb5799bdbe" [[package]] name = "semantic_version" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#344284e01331667c018e6ade5d791a20598a3a5c" +source = "git+https://github.com/zed-industries/zed#eedbede939b76debb4b4fb6fe3fe8f8fe4ce2ee4" dependencies = [ "anyhow", "serde", @@ -5291,7 +5292,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sum_tree" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#344284e01331667c018e6ade5d791a20598a3a5c" +source = "git+https://github.com/zed-industries/zed#eedbede939b76debb4b4fb6fe3fe8f8fe4ce2ee4" dependencies = [ "arrayvec", "log", @@ -6092,7 +6093,7 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "util" version = "0.1.0" -source = "git+https://github.com/zed-industries/zed#344284e01331667c018e6ade5d791a20598a3a5c" +source = "git+https://github.com/zed-industries/zed#eedbede939b76debb4b4fb6fe3fe8f8fe4ce2ee4" dependencies = [ "anyhow", "async-fs 1.6.0", @@ -6707,9 +6708,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "e6f5bb5257f2407a5425c6e749bfd9692192a73e70a6060516ac04f889087d68" dependencies = [ "memchr", ] diff --git a/assets/icons/circle-x.svg b/assets/icons/circle-x.svg index 2a53f1d..9e7b90f 100644 --- a/assets/icons/circle-x.svg +++ b/assets/icons/circle-x.svg @@ -1,3 +1,3 @@ - + diff --git a/assets/icons/close.svg b/assets/icons/close.svg index 49607a2..3469a2e 100644 --- a/assets/icons/close.svg +++ b/assets/icons/close.svg @@ -1,3 +1,3 @@ - + diff --git a/assets/icons/window-close.svg b/assets/icons/window-close.svg index 62b6b0c..9fc4862 100644 --- a/assets/icons/window-close.svg +++ b/assets/icons/window-close.svg @@ -1,6 +1,6 @@ - + diff --git a/assets/icons/window-maximize.svg b/assets/icons/window-maximize.svg index 9da4cd7..7fdbbd8 100644 --- a/assets/icons/window-maximize.svg +++ b/assets/icons/window-maximize.svg @@ -1,6 +1,6 @@ - + diff --git a/assets/icons/window-minimize.svg b/assets/icons/window-minimize.svg index 708e27b..d6b135d 100644 --- a/assets/icons/window-minimize.svg +++ b/assets/icons/window-minimize.svg @@ -1,6 +1,6 @@ - + diff --git a/assets/icons/window-restore.svg b/assets/icons/window-restore.svg index 896b6b6..1401659 100644 --- a/assets/icons/window-restore.svg +++ b/assets/icons/window-restore.svg @@ -1,7 +1,7 @@ - + diff --git a/crates/app/src/views/app.rs b/crates/app/src/views/app.rs index e199736..f34a5bb 100644 --- a/crates/app/src/views/app.rs +++ b/crates/app/src/views/app.rs @@ -9,9 +9,8 @@ use serde::Deserialize; use std::sync::Arc; use super::{ - account::Account, - dock::{chat::ChatPanel, contact::ContactPanel, left_dock::LeftDock, welcome::WelcomePanel}, - onboarding::Onboarding, + account::Account, chat::ChatPanel, contact::ContactPanel, onboarding::Onboarding, + sidebar::Sidebar, welcome::WelcomePanel, }; use crate::states::{account::AccountRegistry, chat::Room}; @@ -86,12 +85,12 @@ impl AppView { } fn init_layout(dock_area: WeakView, cx: &mut WindowContext) { - let left = DockItem::panel(Arc::new(LeftDock::new(cx))); + let left = DockItem::panel(Arc::new(Sidebar::new(cx))); let center = Self::init_dock_items(&dock_area, cx); _ = dock_area.update(cx, |view, cx| { view.set_version(DOCK_AREA.version, cx); - view.set_left_dock(left, Some(px(260.)), true, cx); + view.set_left_dock(left, Some(px(240.)), true, cx); view.set_center(center, cx); view.set_dock_collapsible( Edges { diff --git a/crates/app/src/views/dock/chat/message.rs b/crates/app/src/views/chat/message.rs similarity index 92% rename from crates/app/src/views/dock/chat/message.rs rename to crates/app/src/views/chat/message.rs index ca4e8f3..086e601 100644 --- a/crates/app/src/views/dock/chat/message.rs +++ b/crates/app/src/views/chat/message.rs @@ -45,6 +45,13 @@ impl RenderOnce for RoomMessage { .gap_3() .w_full() .p_2() + .border_l_2() + .border_color(cx.theme().background) + .hover(|this| { + this.bg(cx.theme().muted) + .border_color(cx.theme().primary_active) + .text_color(cx.theme().muted_foreground) + }) .child(div().flex_shrink_0().map(|this| { if let Some(metadata) = self.metadata.clone() { if let Some(picture) = metadata.picture { diff --git a/crates/app/src/views/dock/chat/mod.rs b/crates/app/src/views/chat/mod.rs similarity index 100% rename from crates/app/src/views/dock/chat/mod.rs rename to crates/app/src/views/chat/mod.rs diff --git a/crates/app/src/views/dock/chat/room.rs b/crates/app/src/views/chat/room.rs similarity index 100% rename from crates/app/src/views/dock/chat/room.rs rename to crates/app/src/views/chat/room.rs diff --git a/crates/app/src/views/contact/list.rs b/crates/app/src/views/contact/list.rs new file mode 100644 index 0000000..21834a4 --- /dev/null +++ b/crates/app/src/views/contact/list.rs @@ -0,0 +1,49 @@ +use std::time::Duration; + +use gpui::*; +use nostr_sdk::prelude::*; +use prelude::FluentBuilder; + +use crate::get_client; + +pub struct ContactList { + contacts: Model>>, +} + +impl ContactList { + pub fn new(cx: &mut ViewContext<'_, Self>) -> Self { + let contacts = cx.new_model(|_| None); + let async_contacts = contacts.clone(); + + let mut async_cx = cx.to_async(); + + cx.foreground_executor() + .spawn({ + let client = get_client(); + + async move { + if let Ok(contacts) = async_cx + .background_executor() + .spawn(async move { client.get_contact_list(Duration::from_secs(3)).await }) + .await + { + _ = async_cx.update_model(&async_contacts, |model, cx| { + *model = Some(contacts); + cx.notify(); + }); + } + } + }) + .detach(); + + Self { contacts } + } +} + +impl Render for ContactList { + fn render(&mut self, cx: &mut ViewContext) -> impl IntoElement { + div().when_some(self.contacts.read(cx).as_ref(), |this, contacts| { + this.child("Total").child(contacts.len().to_string()) + }) + } +} diff --git a/crates/app/src/views/dock/contact.rs b/crates/app/src/views/contact/mod.rs similarity index 88% rename from crates/app/src/views/dock/contact.rs rename to crates/app/src/views/contact/mod.rs index 59a0ebd..d3437dd 100644 --- a/crates/app/src/views/dock/contact.rs +++ b/crates/app/src/views/contact/mod.rs @@ -4,12 +4,17 @@ use coop_ui::{ popup_menu::PopupMenu, }; use gpui::*; +use list::ContactList; + +mod list; pub struct ContactPanel { name: SharedString, closeable: bool, zoomable: bool, focus_handle: FocusHandle, + // Contacts + list: View, } impl ContactPanel { @@ -18,11 +23,14 @@ impl ContactPanel { } fn view(cx: &mut ViewContext) -> Self { + let list = cx.new_view(ContactList::new); + Self { name: "Contacts".into(), closeable: true, zoomable: true, focus_handle: cx.focus_handle(), + list, } } } @@ -67,6 +75,6 @@ impl FocusableView for ContactPanel { impl Render for ContactPanel { fn render(&mut self, _cx: &mut gpui::ViewContext) -> impl IntoElement { - div().size_full().child("TODO") + div().size_full().child(self.list.clone()) } } diff --git a/crates/app/src/views/dock/mod.rs b/crates/app/src/views/dock/mod.rs deleted file mode 100644 index a8dcbd6..0000000 --- a/crates/app/src/views/dock/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod chat; -pub mod contact; -pub mod inbox; -pub mod left_dock; -pub mod welcome; diff --git a/crates/app/src/views/dock/inbox/item.rs b/crates/app/src/views/inbox/item.rs similarity index 100% rename from crates/app/src/views/dock/inbox/item.rs rename to crates/app/src/views/inbox/item.rs diff --git a/crates/app/src/views/dock/inbox/mod.rs b/crates/app/src/views/inbox/mod.rs similarity index 100% rename from crates/app/src/views/dock/inbox/mod.rs rename to crates/app/src/views/inbox/mod.rs diff --git a/crates/app/src/views/mod.rs b/crates/app/src/views/mod.rs index 939fae7..3a2da93 100644 --- a/crates/app/src/views/mod.rs +++ b/crates/app/src/views/mod.rs @@ -1,4 +1,9 @@ -pub mod account; pub mod app; -pub mod dock; -pub mod onboarding; + +mod account; +mod chat; +mod contact; +mod inbox; +mod onboarding; +mod sidebar; +mod welcome; diff --git a/crates/app/src/views/dock/left_dock.rs b/crates/app/src/views/sidebar.rs similarity index 79% rename from crates/app/src/views/dock/left_dock.rs rename to crates/app/src/views/sidebar.rs index 446ec78..a5dcf8a 100644 --- a/crates/app/src/views/dock/left_dock.rs +++ b/crates/app/src/views/sidebar.rs @@ -7,11 +7,10 @@ use coop_ui::{ }; use gpui::*; +use super::inbox::Inbox; use crate::views::app::{AddPanel, PanelKind}; -use super::inbox::Inbox; - -pub struct LeftDock { +pub struct Sidebar { // Panel name: SharedString, closeable: bool, @@ -22,7 +21,7 @@ pub struct LeftDock { view_id: EntityId, } -impl LeftDock { +impl Sidebar { pub fn new(cx: &mut WindowContext) -> View { cx.new_view(Self::view) } @@ -41,9 +40,9 @@ impl LeftDock { } } -impl Panel for LeftDock { +impl Panel for Sidebar { fn panel_id(&self) -> SharedString { - "LeftDock".into() + "Sidebar".into() } fn title(&self, _cx: &WindowContext) -> AnyElement { @@ -71,15 +70,15 @@ impl Panel for LeftDock { } } -impl EventEmitter for LeftDock {} +impl EventEmitter for Sidebar {} -impl FocusableView for LeftDock { +impl FocusableView for Sidebar { fn focus_handle(&self, _: &AppContext) -> gpui::FocusHandle { self.focus_handle.clone() } } -impl Render for LeftDock { +impl Render for Sidebar { fn render(&mut self, _cx: &mut ViewContext) -> impl IntoElement { v_flex() .scrollable(self.view_id, ScrollbarAxis::Vertical) @@ -96,9 +95,9 @@ impl Render for LeftDock { .not_centered() .bold() .icon(Icon::new(IconName::Plus)) - .label("Compose") + .label("New") .on_click(|_, cx| { - cx.open_modal(move |modal, _| modal.title("Compose").child("TODO")); + cx.open_modal(move |modal, _| modal.child("TODO")); }), ) .child( @@ -115,18 +114,6 @@ impl Render for LeftDock { position: coop_ui::dock::DockPlacement::Center, })) }), - ) - .child( - Button::new("find") - .small() - .ghost() - .not_centered() - .bold() - .icon(Icon::new(IconName::Search)) - .label("Find") - .on_click(|_, cx| { - cx.open_modal(move |modal, _| modal.title("Find").child("TODO")); - }), ), ) .child(self.inbox.clone()) diff --git a/crates/app/src/views/dock/welcome.rs b/crates/app/src/views/welcome.rs similarity index 100% rename from crates/app/src/views/dock/welcome.rs rename to crates/app/src/views/welcome.rs diff --git a/crates/ui/src/button.rs b/crates/ui/src/button.rs index bfb8484..88b6a75 100644 --- a/crates/ui/src/button.rs +++ b/crates/ui/src/button.rs @@ -458,8 +458,8 @@ impl RenderOnce for Button { .items_center() .justify_center() .map(|this| match self.size { - Size::XSmall => this.gap_1().text_xs(), - Size::Small => this.gap_2().text_xs(), + Size::XSmall => this.gap_0p5().text_xs(), + Size::Small => this.gap_1().text_xs(), _ => this.gap_2().text_base(), }) .when(!self.loading, |this| {