From 17dc98402f6bd5a25be49ae2af04a0c022ff3db7 Mon Sep 17 00:00:00 2001 From: reya Date: Thu, 2 Jan 2025 20:57:59 +0700 Subject: [PATCH] wip: refactor --- crates/app/src/main.rs | 2 +- crates/app/src/states/account.rs | 27 ++++++++++----------- crates/app/src/states/metadata.rs | 1 - crates/app/src/views/chat/message.rs | 6 ++--- crates/app/src/views/contact/item.rs | 35 ++++++++++++++-------------- crates/app/src/views/contact/mod.rs | 25 +++++++++++++++++--- crates/app/src/views/inbox/item.rs | 9 +++---- crates/app/src/views/inbox/mod.rs | 2 -- crates/app/src/views/sidebar.rs | 2 +- 9 files changed, 63 insertions(+), 46 deletions(-) diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index f819664..126e719 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -84,7 +84,7 @@ async fn main() { _ = client.connect().await; // Signal - let (signal_tx, mut signal_rx) = mpsc::channel::(4000); // TODO: adjust? + let (signal_tx, mut signal_rx) = mpsc::channel::(4096); // TODO: adjust? let (mta_tx, mut mta_rx) = mpsc::unbounded_channel::(); // Re use sender diff --git a/crates/app/src/states/account.rs b/crates/app/src/states/account.rs index f3a788d..8797408 100644 --- a/crates/app/src/states/account.rs +++ b/crates/app/src/states/account.rs @@ -1,4 +1,3 @@ -use async_utility::task::spawn; use gpui::*; use nostr_sdk::prelude::*; use std::time::Duration; @@ -41,19 +40,21 @@ impl AccountRegistry { .pubkey(public_key) .limit(0); - spawn(async move { - // Subscribe for all messages - if client - .subscribe_with_id(all_messages_sub_id, vec![all_messages], Some(opts)) - .await - .is_ok() - { - // Subscribe for new message - _ = client - .subscribe_with_id(new_message_sub_id, vec![new_message], None) + cx.background_executor() + .spawn(async move { + // Subscribe for all messages + if client + .subscribe_with_id(all_messages_sub_id, vec![all_messages], Some(opts)) .await - } - }); + .is_ok() + { + // Subscribe for new message + _ = client + .subscribe_with_id(new_message_sub_id, vec![new_message], None) + .await + } + }) + .detach(); } }) .detach(); diff --git a/crates/app/src/states/metadata.rs b/crates/app/src/states/metadata.rs index 05c65cf..020e42e 100644 --- a/crates/app/src/states/metadata.rs +++ b/crates/app/src/states/metadata.rs @@ -22,7 +22,6 @@ impl MetadataRegistry { if !seens.contains(&public_key) { seens.push(public_key); - drop(seens); if let Some(metadata) = metadata { diff --git a/crates/app/src/views/chat/message.rs b/crates/app/src/views/chat/message.rs index 6152062..546e468 100644 --- a/crates/app/src/views/chat/message.rs +++ b/crates/app/src/views/chat/message.rs @@ -57,12 +57,10 @@ impl RenderOnce for RoomMessage { if let Some(picture) = metadata.picture { this.child( img(format!( - "{}/?url={}&w=100&h=100&n=-1", + "{}/?url={}&w=100&h=100&fit=cover&mask=circle&n=-1", IMAGE_SERVICE, picture )) - .size_8() - .rounded_full() - .object_fit(ObjectFit::Cover), + .size_8(), ) } else { this.child(img("brand/avatar.png").size_8().rounded_full()) diff --git a/crates/app/src/views/contact/item.rs b/crates/app/src/views/contact/item.rs index 9e4cec1..15021b1 100644 --- a/crates/app/src/views/contact/item.rs +++ b/crates/app/src/views/contact/item.rs @@ -64,44 +64,45 @@ impl ContactListItem { impl Render for ContactListItem { fn render(&mut self, cx: &mut ViewContext) -> impl IntoElement { let fallback = show_npub(self.public_key, 16); - let mut content = div().h_10().text_sm(); + let mut content = div() + .w_full() + .h_10() + .px_2() + .flex() + .items_center() + .gap_2() + .text_sm(); if let Some(metadata) = self.metadata.read(cx).as_ref() { content = content - .flex() - .items_center() - .gap_2() .map(|this| { if let Some(picture) = metadata.picture.clone() { - this.child( - img(format!("{}/?url={}&w=72&h=72&n=-1", IMAGE_SERVICE, picture)) - .size_8() - .rounded_full() - .object_fit(ObjectFit::Cover), + this.flex_shrink_0().child( + img(format!( + "{}/?url={}&w=72&h=72&fit=cover&mask=circle&n=-1", + IMAGE_SERVICE, picture + )) + .size_8(), ) } else { - this.child(img("brand/avatar.png").size_8().rounded_full()) + this.flex_shrink_0() + .child(img("brand/avatar.png").size_8().rounded_full()) } }) .map(|this| { if let Some(display_name) = metadata.display_name.clone() { - this.child(display_name) + this.flex_1().child(display_name) } else { - this.child(fallback) + this.flex_1().child(fallback) } }) } else { content = content - .flex() - .items_center() - .gap_2() .child(img("brand/avatar.png").size_8().rounded_full()) .child(fallback) } div() - .w_full() - .px_2() .rounded_md() .hover(|this| { this.bg(cx.theme().muted) diff --git a/crates/app/src/views/contact/mod.rs b/crates/app/src/views/contact/mod.rs index feb499b..f2fa19d 100644 --- a/crates/app/src/views/contact/mod.rs +++ b/crates/app/src/views/contact/mod.rs @@ -6,9 +6,11 @@ use prelude::FluentBuilder; use ui::{ button::Button, dock::{Panel, PanelEvent, PanelState}, + indicator::Indicator, popup_menu::PopupMenu, scroll::ScrollbarAxis, - v_flex, StyledExt, + theme::ActiveTheme, + v_flex, Sizable, StyledExt, }; use crate::get_client; @@ -120,8 +122,25 @@ impl Render for ContactPanel { .w_full() .gap_1() .p_2() - .when_some(self.contacts.read(cx).as_ref(), |this, contacts| { - this.children(contacts.clone()) + .map(|this| { + if let Some(contacts) = self.contacts.read(cx).as_ref() { + this.children(contacts.clone()) + } else { + this.w_full() + .h_40() + .flex() + .items_center() + .justify_center() + .child( + div() + .flex() + .items_center() + .gap_1p5() + .text_color(cx.theme().muted_foreground) + .child(Indicator::new().small()) + .child(div().text_xs().child("Loading")), + ) + } }) } } diff --git a/crates/app/src/views/inbox/item.rs b/crates/app/src/views/inbox/item.rs index f400234..971da10 100644 --- a/crates/app/src/views/inbox/item.rs +++ b/crates/app/src/views/inbox/item.rs @@ -95,10 +95,11 @@ impl Render for InboxListItem { .map(|this| { if let Some(picture) = metadata.picture.clone() { this.flex_shrink_0().child( - img(format!("{}/?url={}&w=72&h=72&n=-1", IMAGE_SERVICE, picture)) - .size_6() - .rounded_full() - .object_fit(ObjectFit::Cover), + img(format!( + "{}/?url={}&w=72&h=72&fit=cover&mask=circle&n=-1", + IMAGE_SERVICE, picture + )) + .size_6(), ) } else { this.flex_shrink_0() diff --git a/crates/app/src/views/inbox/mod.rs b/crates/app/src/views/inbox/mod.rs index fe6b5c6..589a31e 100644 --- a/crates/app/src/views/inbox/mod.rs +++ b/crates/app/src/views/inbox/mod.rs @@ -45,8 +45,6 @@ impl Inbox { let keys = m.event.tags.public_keys().copied().collect::>(); let new_id = get_room_id(&m.event.pubkey, &keys); - drop(keys); - !current_rooms.iter().any(|id| id == &new_id) }) .collect::>(); diff --git a/crates/app/src/views/sidebar.rs b/crates/app/src/views/sidebar.rs index 2e9bf6b..cb05e85 100644 --- a/crates/app/src/views/sidebar.rs +++ b/crates/app/src/views/sidebar.rs @@ -82,7 +82,7 @@ impl Render for Sidebar { fn render(&mut self, _cx: &mut ViewContext) -> impl IntoElement { v_flex() .scrollable(self.view_id, ScrollbarAxis::Vertical) - .pt_3() + .py_3() .gap_3() .child( v_flex()