From d53e75b7752d81b90df3fce6386569e0decc4b89 Mon Sep 17 00:00:00 2001 From: reya Date: Thu, 2 Jan 2025 08:34:10 +0700 Subject: [PATCH] wip: refactor --- Cargo.lock | 46 +++++++++---------- assets/icons/compose-fill.svg | 3 ++ assets/icons/group-fill.svg | 3 ++ crates/app/Cargo.toml | 2 +- crates/app/src/main.rs | 67 +++++++++++----------------- crates/app/src/states/chat.rs | 14 +++--- crates/app/src/views/account.rs | 8 ++-- crates/app/src/views/app.rs | 10 ++--- crates/app/src/views/chat/message.rs | 2 +- crates/app/src/views/chat/mod.rs | 8 ++-- crates/app/src/views/chat/room.rs | 12 ++--- crates/app/src/views/contact/item.rs | 29 ++++++------ crates/app/src/views/contact/list.rs | 57 ----------------------- crates/app/src/views/contact/mod.rs | 64 ++++++++++++++++++++++---- crates/app/src/views/inbox/item.rs | 19 ++++---- crates/app/src/views/inbox/mod.rs | 21 ++++----- crates/app/src/views/onboarding.rs | 10 ++--- crates/app/src/views/sidebar.rs | 14 +++--- crates/app/src/views/welcome.rs | 4 +- crates/ui/Cargo.toml | 2 +- crates/ui/src/icon.rs | 4 ++ 21 files changed, 188 insertions(+), 211 deletions(-) create mode 100644 assets/icons/compose-fill.svg create mode 100644 assets/icons/group-fill.svg delete mode 100644 crates/app/src/views/contact/list.rs diff --git a/Cargo.lock b/Cargo.lock index 7629c2b..14e09cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1199,7 +1199,6 @@ version = "0.1.0" dependencies = [ "anyhow", "chrono", - "coop-ui", "dirs 5.0.1", "gpui", "itertools 0.13.0", @@ -1214,28 +1213,7 @@ dependencies = [ "smol", "tokio", "tracing-subscriber", -] - -[[package]] -name = "coop-ui" -version = "0.1.0" -dependencies = [ - "anyhow", - "chrono", - "gpui", - "image", - "itertools 0.13.0", - "nostr-sdk", - "once_cell", - "paste", - "regex", - "rust-embed", - "serde", - "serde_json", - "smallvec", - "smol", - "unicode-segmentation", - "uuid", + "ui", ] [[package]] @@ -5941,6 +5919,28 @@ dependencies = [ "winapi", ] +[[package]] +name = "ui" +version = "0.1.0" +dependencies = [ + "anyhow", + "chrono", + "gpui", + "image", + "itertools 0.13.0", + "nostr-sdk", + "once_cell", + "paste", + "regex", + "rust-embed", + "serde", + "serde_json", + "smallvec", + "smol", + "unicode-segmentation", + "uuid", +] + [[package]] name = "unicase" version = "2.8.1" diff --git a/assets/icons/compose-fill.svg b/assets/icons/compose-fill.svg new file mode 100644 index 0000000..4d4b4e0 --- /dev/null +++ b/assets/icons/compose-fill.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/icons/group-fill.svg b/assets/icons/group-fill.svg new file mode 100644 index 0000000..e8e3704 --- /dev/null +++ b/assets/icons/group-fill.svg @@ -0,0 +1,3 @@ + + + diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml index 6a4e27a..3bfab0f 100644 --- a/crates/app/Cargo.toml +++ b/crates/app/Cargo.toml @@ -9,7 +9,7 @@ name = "coop" path = "src/main.rs" [dependencies] -coop-ui = { path = "../ui" } +ui = { path = "../ui" } gpui.workspace = true reqwest_client.workspace = true diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index 3e45206..03e0e7c 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -1,5 +1,4 @@ use asset::Assets; -use coop_ui::Root; use dirs::config_dir; use gpui::*; use nostr_sdk::prelude::*; @@ -14,6 +13,7 @@ use tokio::{ sync::{mpsc, Mutex}, time::sleep, }; +use ui::Root; use constants::{ALL_MESSAGES_SUB_ID, APP_NAME, FAKE_SIG, METADATA_DELAY, NEW_MESSAGE_SUB_ID}; use states::{ @@ -81,7 +81,7 @@ async fn main() { _ = client.connect().await; // Signal - let (signal_tx, mut signal_rx) = mpsc::channel::(10000); + let (signal_tx, mut signal_rx) = mpsc::channel::(4000); // TODO: adjust? let (mta_tx, mut mta_rx) = mpsc::unbounded_channel::(); // Re use sender @@ -92,6 +92,7 @@ async fn main() { tokio::spawn(async move { let sig = Signature::from_str(FAKE_SIG).unwrap(); let new_message = SubscriptionId::new(NEW_MESSAGE_SUB_ID); + let all_messages = SubscriptionId::new(ALL_MESSAGES_SUB_ID); while let Ok(notification) = notifications.recv().await { #[allow(clippy::collapsible_match)] @@ -142,8 +143,10 @@ async fn main() { } } } else if let RelayMessage::EndOfStoredEvents(subscription_id) = message { - if let Err(e) = signal_tx.send(Signal::RecvEose(subscription_id)).await { - println!("Send error: {}", e) + if subscription_id == all_messages { + if let Err(e) = signal_tx.send(Signal::RecvEose(subscription_id)).await { + println!("Send error: {}", e) + } } } } @@ -203,50 +206,32 @@ async fn main() { SignalRegistry::set_global(cx, mta_tx_clone); // Initialize components - coop_ui::init(cx); + ui::init(cx); // Set quit action cx.on_action(quit); - /* cx.spawn(|async_cx| async move { - let accounts = get_all_accounts_from_keyring(); + let (tx, rx) = smol::channel::unbounded::(); - // Automatically Login if only have 1 account - if let Some(account) = accounts.into_iter().next() { - if let Ok(keys) = get_keys_by_account(account) { - get_client().set_signer(keys).await; - - _ = async_cx.update_global::(|state, _| { - state.set_user(Some(account)); - }); - } - } - }) - .detach(); - */ - - cx.spawn(|async_cx| async move { - let all_messages = SubscriptionId::new(ALL_MESSAGES_SUB_ID); - let mut is_initialized = false; - - while let Some(signal) = signal_rx.recv().await { - match signal { - Signal::RecvEose(id) => { - if id == all_messages { - if !is_initialized { - _ = async_cx.update_global::(|state, _| { - state.set_init(); - }); - - is_initialized = true; - } else { - _ = async_cx.update_global::(|state, _| { - state.set_reload(); - }); - } + async_cx + .background_executor() + .spawn(async move { + while let Some(signal) = signal_rx.recv().await { + if let Err(e) = tx.send(signal).await { + println!("Send error: {}", e) } } + }) + .detach(); + + while let Ok(signal) = rx.recv().await { + match signal { + Signal::RecvEose(_) => { + _ = async_cx.update_global::(|state, _| { + state.update(); + }); + } Signal::RecvEvent(event) => { let metadata = async_cx .background_executor() @@ -277,7 +262,7 @@ async fn main() { _ = async_cx.update_global::(|state, _cx| { state.seen(public_key, metadata); - }) + }); } _ => {} } diff --git a/crates/app/src/states/chat.rs b/crates/app/src/states/chat.rs index 6d3a0df..8981ac5 100644 --- a/crates/app/src/states/chat.rs +++ b/crates/app/src/states/chat.rs @@ -15,6 +15,7 @@ pub struct Room { pub last_seen: Timestamp, pub title: Option, pub metadata: Option, + is_initialized: bool, } impl Room { @@ -48,6 +49,7 @@ impl Room { last_seen, owner, metadata, + is_initialized: false, } } } @@ -71,12 +73,12 @@ impl ChatRegistry { cx.set_global(Self::new()); } - pub fn set_init(&mut self) { - self.is_initialized = true; - } - - pub fn set_reload(&mut self) { - self.reload = true; + pub fn update(&mut self) { + if !self.is_initialized { + self.is_initialized = true; + } else { + self.reload = true; + } } pub fn push(&mut self, event: Event, metadata: Option) { diff --git a/crates/app/src/views/account.rs b/crates/app/src/views/account.rs index 3ac8d1f..785c70f 100644 --- a/crates/app/src/views/account.rs +++ b/crates/app/src/views/account.rs @@ -1,11 +1,11 @@ -use coop_ui::{ +use gpui::*; +use nostr_sdk::prelude::*; +use prelude::FluentBuilder; +use ui::{ button::{Button, ButtonVariants}, popup_menu::PopupMenuExt, Icon, IconName, Sizable, }; -use gpui::*; -use nostr_sdk::prelude::*; -use prelude::FluentBuilder; use crate::{ constants::IMAGE_SERVICE, diff --git a/crates/app/src/views/app.rs b/crates/app/src/views/app.rs index f34a5bb..67961ee 100644 --- a/crates/app/src/views/app.rs +++ b/crates/app/src/views/app.rs @@ -1,12 +1,12 @@ -use coop_ui::{ - dock::{DockArea, DockItem, DockPlacement}, - theme::Theme, - Root, TitleBar, -}; use gpui::*; use prelude::FluentBuilder; use serde::Deserialize; use std::sync::Arc; +use ui::{ + dock::{DockArea, DockItem, DockPlacement}, + theme::Theme, + Root, TitleBar, +}; use super::{ account::Account, chat::ChatPanel, contact::ContactPanel, onboarding::Onboarding, diff --git a/crates/app/src/views/chat/message.rs b/crates/app/src/views/chat/message.rs index 086e601..6152062 100644 --- a/crates/app/src/views/chat/message.rs +++ b/crates/app/src/views/chat/message.rs @@ -1,7 +1,7 @@ -use coop_ui::{theme::ActiveTheme, StyledExt}; use gpui::*; use nostr_sdk::prelude::*; use prelude::FluentBuilder; +use ui::{theme::ActiveTheme, StyledExt}; use crate::{ constants::IMAGE_SERVICE, diff --git a/crates/app/src/views/chat/mod.rs b/crates/app/src/views/chat/mod.rs index 229b67c..d534b75 100644 --- a/crates/app/src/views/chat/mod.rs +++ b/crates/app/src/views/chat/mod.rs @@ -1,13 +1,13 @@ use std::sync::Arc; -use coop_ui::{ +use gpui::*; +use nostr_sdk::prelude::*; +use room::RoomPanel; +use ui::{ button::Button, dock::{Panel, PanelEvent, PanelState}, popup_menu::PopupMenu, }; -use gpui::*; -use nostr_sdk::prelude::*; -use room::RoomPanel; use crate::states::chat::Room; diff --git a/crates/app/src/views/chat/room.rs b/crates/app/src/views/chat/room.rs index 9ccd5d4..1f839a6 100644 --- a/crates/app/src/views/chat/room.rs +++ b/crates/app/src/views/chat/room.rs @@ -1,13 +1,13 @@ -use coop_ui::{ +use gpui::*; +use itertools::Itertools; +use nostr_sdk::prelude::*; +use std::sync::Arc; +use ui::{ button::{Button, ButtonVariants}, input::{InputEvent, TextInput}, theme::ActiveTheme, v_flex, Icon, IconName, }; -use gpui::*; -use itertools::Itertools; -use nostr_sdk::prelude::*; -use std::sync::Arc; use super::message::RoomMessage; use crate::{ @@ -43,7 +43,7 @@ impl RoomPanel { let input = cx.new_view(|cx| { TextInput::new(cx) .appearance(false) - .text_size(coop_ui::Size::Small) + .text_size(ui::Size::Small) .placeholder("Message...") .cleanable() }); diff --git a/crates/app/src/views/contact/item.rs b/crates/app/src/views/contact/item.rs index 3303e98..9e4cec1 100644 --- a/crates/app/src/views/contact/item.rs +++ b/crates/app/src/views/contact/item.rs @@ -1,7 +1,7 @@ -use coop_ui::StyledExt; use gpui::*; use nostr_sdk::prelude::*; use prelude::FluentBuilder; +use ui::theme::ActiveTheme; use crate::{ constants::IMAGE_SERVICE, @@ -64,7 +64,7 @@ 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(); + let mut content = div().h_10().text_sm(); if let Some(metadata) = self.metadata.read(cx).as_ref() { content = content @@ -73,15 +73,14 @@ impl Render for ContactListItem { .gap_2() .map(|this| { if let Some(picture) = metadata.picture.clone() { - this.flex_shrink_0().child( + this.child( img(format!("{}/?url={}&w=72&h=72&n=-1", IMAGE_SERVICE, picture)) - .size_6() + .size_8() .rounded_full() .object_fit(ObjectFit::Cover), ) } else { - this.flex_shrink_0() - .child(img("brand/avatar.png").size_6().rounded_full()) + this.child(img("brand/avatar.png").size_8().rounded_full()) } }) .map(|this| { @@ -96,20 +95,18 @@ impl Render for ContactListItem { .flex() .items_center() .gap_2() - .child( - img("brand/avatar.png") - .flex_shrink_0() - .size_6() - .rounded_full(), - ) + .child(img("brand/avatar.png").size_8().rounded_full()) .child(fallback) } div() - .scrollable( - cx.view().entity_id(), - coop_ui::scroll::ScrollbarAxis::Vertical, - ) + .w_full() + .px_2() + .rounded_md() + .hover(|this| { + this.bg(cx.theme().muted) + .text_color(cx.theme().muted_foreground) + }) .child(content) } } diff --git a/crates/app/src/views/contact/list.rs b/crates/app/src/views/contact/list.rs deleted file mode 100644 index 2550789..0000000 --- a/crates/app/src/views/contact/list.rs +++ /dev/null @@ -1,57 +0,0 @@ -use gpui::*; -use prelude::FluentBuilder; -use std::time::Duration; - -use super::item::ContactListItem; -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 - { - let views: Vec> = contacts - .into_iter() - .map(|contact| { - async_cx - .new_view(|cx| ContactListItem::new(contact.public_key, cx)) - .unwrap() - }) - .collect(); - - _ = async_cx.update_model(&async_contacts, |model, cx| { - *model = Some(views); - 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.children(contacts.clone()) - }) - } -} diff --git a/crates/app/src/views/contact/mod.rs b/crates/app/src/views/contact/mod.rs index 3c74fb1..feb499b 100644 --- a/crates/app/src/views/contact/mod.rs +++ b/crates/app/src/views/contact/mod.rs @@ -1,13 +1,19 @@ -use coop_ui::{ +use std::time::Duration; + +use gpui::*; +use item::ContactListItem; +use prelude::FluentBuilder; +use ui::{ button::Button, dock::{Panel, PanelEvent, PanelState}, popup_menu::PopupMenu, + scroll::ScrollbarAxis, + v_flex, StyledExt, }; -use gpui::*; -use list::ContactList; + +use crate::get_client; mod item; -mod list; pub struct ContactPanel { name: SharedString, @@ -15,7 +21,8 @@ pub struct ContactPanel { zoomable: bool, focus_handle: FocusHandle, // Contacts - list: View, + view_id: EntityId, + contacts: Model>>>, } impl ContactPanel { @@ -24,14 +31,46 @@ impl ContactPanel { } fn view(cx: &mut ViewContext) -> Self { - let list = cx.new_view(ContactList::new); + 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 + { + let views: Vec> = contacts + .into_iter() + .map(|contact| { + async_cx + .new_view(|cx| ContactListItem::new(contact.public_key, cx)) + .unwrap() + }) + .collect(); + + _ = async_cx.update_model(&async_contacts, |model, cx| { + *model = Some(views); + cx.notify(); + }); + } + } + }) + .detach(); Self { name: "Contacts".into(), closeable: true, zoomable: true, focus_handle: cx.focus_handle(), - list, + view_id: cx.entity_id(), + contacts, } } } @@ -75,7 +114,14 @@ impl FocusableView for ContactPanel { } impl Render for ContactPanel { - fn render(&mut self, _cx: &mut gpui::ViewContext) -> impl IntoElement { - div().size_full().child(self.list.clone()) + fn render(&mut self, cx: &mut gpui::ViewContext) -> impl IntoElement { + v_flex() + .scrollable(self.view_id, ScrollbarAxis::Vertical) + .w_full() + .gap_1() + .p_2() + .when_some(self.contacts.read(cx).as_ref(), |this, contacts| { + this.children(contacts.clone()) + }) } } diff --git a/crates/app/src/views/inbox/item.rs b/crates/app/src/views/inbox/item.rs index 25eee05..f400234 100644 --- a/crates/app/src/views/inbox/item.rs +++ b/crates/app/src/views/inbox/item.rs @@ -1,8 +1,8 @@ -use coop_ui::{theme::ActiveTheme, StyledExt}; use gpui::*; use nostr_sdk::prelude::*; use prelude::FluentBuilder; use std::sync::Arc; +use ui::{theme::ActiveTheme, StyledExt}; use crate::{ constants::IMAGE_SERVICE, @@ -12,23 +12,18 @@ use crate::{ views::app::{AddPanel, PanelKind}, }; -pub struct InboxItem { +pub struct InboxListItem { id: SharedString, event: Event, metadata: Model>, } -impl InboxItem { +impl InboxListItem { pub fn new(event: Event, cx: &mut ViewContext<'_, Self>) -> Self { let pubkeys: Vec = event.tags.public_keys().copied().collect(); let id = get_room_id(&event.pubkey, &pubkeys).into(); let metadata = cx.new_model(|_| None); - drop(pubkeys); - - // Request metadata - _ = cx.global::().tx.send(event.pubkey); - // Reload when received metadata cx.observe_global::(|chat, cx| { chat.load_metadata(cx); @@ -42,6 +37,10 @@ impl InboxItem { } } + pub fn request_metadata(&mut self, cx: &mut ViewContext) { + _ = cx.global::().tx.send(self.event.pubkey); + } + pub fn load_metadata(&mut self, cx: &mut ViewContext) { let public_key = self.event.pubkey; let async_metadata = self.metadata.clone(); @@ -74,12 +73,12 @@ impl InboxItem { cx.dispatch_action(Box::new(AddPanel { panel: PanelKind::Room(room), - position: coop_ui::dock::DockPlacement::Center, + position: ui::dock::DockPlacement::Center, })) } } -impl Render for InboxItem { +impl Render for InboxListItem { fn render(&mut self, cx: &mut ViewContext) -> impl IntoElement { let ago = ago(self.event.created_at.as_u64()); let fallback_name = show_npub(self.event.pubkey, 16); diff --git a/crates/app/src/views/inbox/mod.rs b/crates/app/src/views/inbox/mod.rs index 7216e6d..fe6b5c6 100644 --- a/crates/app/src/views/inbox/mod.rs +++ b/crates/app/src/views/inbox/mod.rs @@ -1,20 +1,18 @@ -use coop_ui::{ - skeleton::Skeleton, theme::ActiveTheme, v_flex, Collapsible, Icon, IconName, StyledExt, -}; use gpui::*; -use item::InboxItem; use itertools::Itertools; use nostr_sdk::prelude::*; use prelude::FluentBuilder; use std::cmp::Reverse; +use ui::{skeleton::Skeleton, theme::ActiveTheme, v_flex, Collapsible, Icon, IconName, StyledExt}; +use super::inbox::item::InboxListItem; use crate::{get_client, states::chat::ChatRegistry, utils::get_room_id}; pub mod item; pub struct Inbox { label: SharedString, - items: Model>>>, + items: Model>>>, is_loading: bool, is_collapsed: bool, } @@ -56,7 +54,7 @@ impl Inbox { // Create view for new chats only let new = messages .into_iter() - .map(|m| cx.new_view(|cx| InboxItem::new(m.event, cx))) + .map(|m| cx.new_view(|cx| InboxListItem::new(m.event, cx))) .collect::>(); cx.update_model(&this.items, |a, b| { @@ -70,8 +68,9 @@ impl Inbox { }) .detach(); - cx.observe_new_views::(|chat, cx| { - chat.load_metadata(cx); + cx.observe_new_views::(|item, cx| { + item.request_metadata(cx); + item.load_metadata(cx); }) .detach(); @@ -124,17 +123,15 @@ impl Inbox { }) .await; - let views: Vec> = events + let views: Vec> = events .into_iter() .filter(|ev| { let keys = ev.tags.public_keys().copied().collect::>(); let new_id = get_room_id(&ev.pubkey, &keys); - drop(keys); - !current_rooms.iter().any(|id| id == &new_id) }) - .map(|ev| async_cx.new_view(|cx| InboxItem::new(ev, cx)).unwrap()) + .map(|ev| async_cx.new_view(|cx| InboxListItem::new(ev, cx)).unwrap()) .collect(); async_cx.update_model(&async_items, |model, cx| { diff --git a/crates/app/src/views/onboarding.rs b/crates/app/src/views/onboarding.rs index 321f3e1..29a2eeb 100644 --- a/crates/app/src/views/onboarding.rs +++ b/crates/app/src/views/onboarding.rs @@ -1,11 +1,11 @@ use async_utility::task::spawn; -use coop_ui::{ - input::{InputEvent, TextInput}, - label::Label, -}; use gpui::*; use keyring::Entry; use nostr_sdk::prelude::*; +use ui::{ + input::{InputEvent, TextInput}, + label::Label, +}; use crate::{constants::KEYRING_SERVICE, get_client, states::account::AccountRegistry}; @@ -17,7 +17,7 @@ impl Onboarding { pub fn new(cx: &mut ViewContext<'_, Self>) -> Self { let input = cx.new_view(|cx| { let mut input = TextInput::new(cx); - input.set_size(coop_ui::Size::Medium, cx); + input.set_size(ui::Size::Medium, cx); input }); diff --git a/crates/app/src/views/sidebar.rs b/crates/app/src/views/sidebar.rs index a5dcf8a..2e9bf6b 100644 --- a/crates/app/src/views/sidebar.rs +++ b/crates/app/src/views/sidebar.rs @@ -1,11 +1,11 @@ -use coop_ui::{ +use gpui::*; +use ui::{ button::{Button, ButtonVariants}, dock::{Panel, PanelEvent, PanelState}, popup_menu::PopupMenu, scroll::ScrollbarAxis, v_flex, ContextModal, Icon, IconName, Sizable, StyledExt, }; -use gpui::*; use super::inbox::Inbox; use crate::views::app::{AddPanel, PanelKind}; @@ -93,9 +93,8 @@ impl Render for Sidebar { .small() .ghost() .not_centered() - .bold() - .icon(Icon::new(IconName::Plus)) - .label("New") + .icon(Icon::new(IconName::ComposeFill)) + .label("New Message") .on_click(|_, cx| { cx.open_modal(move |modal, _| modal.child("TODO")); }), @@ -105,13 +104,12 @@ impl Render for Sidebar { .small() .ghost() .not_centered() - .bold() - .icon(Icon::new(IconName::Group)) + .icon(Icon::new(IconName::GroupFill)) .label("Contacts") .on_click(|_, cx| { cx.dispatch_action(Box::new(AddPanel { panel: PanelKind::Contact, - position: coop_ui::dock::DockPlacement::Center, + position: ui::dock::DockPlacement::Center, })) }), ), diff --git a/crates/app/src/views/welcome.rs b/crates/app/src/views/welcome.rs index de6b19a..c26db9e 100644 --- a/crates/app/src/views/welcome.rs +++ b/crates/app/src/views/welcome.rs @@ -1,11 +1,11 @@ -use coop_ui::{ +use gpui::*; +use ui::{ button::Button, dock::{Panel, PanelEvent, PanelState}, popup_menu::PopupMenu, theme::{ActiveTheme, Colorize}, StyledExt, }; -use gpui::*; pub struct WelcomePanel { name: SharedString, diff --git a/crates/ui/Cargo.toml b/crates/ui/Cargo.toml index a474b9f..db4a971 100644 --- a/crates/ui/Cargo.toml +++ b/crates/ui/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "coop-ui" +name = "ui" version = "0.1.0" edition = "2021" publish = false diff --git a/crates/ui/src/icon.rs b/crates/ui/src/icon.rs index 43f0219..ea0a27c 100644 --- a/crates/ui/src/icon.rs +++ b/crates/ui/src/icon.rs @@ -30,6 +30,7 @@ pub enum IconName { CircleX, Close, Copy, + ComposeFill, Dash, Delete, Ellipsis, @@ -41,6 +42,7 @@ pub enum IconName { GitHub, Globe, Group, + GroupFill, Heart, HeartOff, Inbox, @@ -111,6 +113,7 @@ impl IconName { Self::CircleX => "icons/circle-x.svg", Self::Close => "icons/close.svg", Self::Copy => "icons/copy.svg", + Self::ComposeFill => "icons/compose-fill.svg", Self::Dash => "icons/dash.svg", Self::Delete => "icons/delete.svg", Self::Ellipsis => "icons/ellipsis.svg", @@ -122,6 +125,7 @@ impl IconName { Self::GitHub => "icons/github.svg", Self::Globe => "icons/globe.svg", Self::Group => "icons/group.svg", + Self::GroupFill => "icons/group-fill.svg", Self::Heart => "icons/heart.svg", Self::HeartOff => "icons/heart-off.svg", Self::Inbox => "icons/inbox.svg",