From 785d102e80ee20954f94781b1677973d22b0dbe6 Mon Sep 17 00:00:00 2001 From: kernelkind Date: Tue, 17 Dec 2024 13:53:21 -0500 Subject: [PATCH] show profile preview for external pubkeys Closes: https://github.com/damus-io/notedeck/pull/589 Signed-off-by: kernelkind Signed-off-by: William Casarin --- assets/icons/profile_icon_4x.png | Bin 0 -> 4010 bytes crates/notedeck_columns/src/ui/add_column.rs | 100 +++++++++++++------ 2 files changed, 67 insertions(+), 33 deletions(-) create mode 100644 assets/icons/profile_icon_4x.png diff --git a/assets/icons/profile_icon_4x.png b/assets/icons/profile_icon_4x.png new file mode 100644 index 0000000000000000000000000000000000000000..db877425e0ee44372bb8947a06d8d5ff39d74cca GIT binary patch literal 4010 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 { key_state_map: &'a mut HashMap, ndb: &'a Ndb, + img_cache: &'a mut ImageCache, cur_account: Option<&'a UserAccount>, } @@ -105,11 +105,13 @@ impl<'a> AddColumnView<'a> { pub fn new( key_state_map: &'a mut HashMap, ndb: &'a Ndb, + img_cache: &'a mut ImageCache, cur_account: Option<&'a UserAccount>, ) -> Self { Self { key_state_map, ndb, + img_cache, cur_account, } } @@ -144,7 +146,6 @@ impl<'a> AddColumnView<'a> { fn external_notification_ui(&mut self, ui: &mut Ui) -> Option { let id = ui.id().with("external_notif"); - self.external_ui(ui, id, |pubkey| { AddColumnOption::Notification(PubkeySource::Explicit(pubkey)) }) @@ -176,7 +177,7 @@ impl<'a> AddColumnView<'a> { &mut self, ui: &mut Ui, id: egui::Id, - to_tl: fn(Pubkey) -> AddColumnOption, + to_option: fn(Pubkey) -> AddColumnOption, ) -> Option { padding(16.0, ui, |ui| { let key_state = self.key_state_map.entry(id).or_default(); @@ -195,28 +196,40 @@ impl<'a> AddColumnView<'a> { ui.add(text_edit); - if ui.button("Add").clicked() { + key_state.handle_input_change_after_acquire(); + key_state.loading_and_error_ui(ui); + + if key_state.get_login_keypair().is_none() && ui.add(find_user_button()).clicked() { key_state.apply_acquire(); } - if key_state.is_awaiting_network() { - ui.spinner(); - } + let resp = if let Some(keypair) = key_state.get_login_keypair() { + let txn = Transaction::new(self.ndb).expect("txn"); + if let Ok(profile) = self.ndb.get_profile_by_pubkey(&txn, keypair.pubkey.bytes()) { + egui::Frame::window(ui.style()) + .outer_margin(Margin { + left: 4.0, + right: 4.0, + top: 12.0, + bottom: 32.0, + }) + .show(ui, |ui| { + ProfilePreview::new(&profile, self.img_cache).ui(ui); + }); + } - if let Some(error) = key_state.check_for_error() { - error!("acquire key error: {}", error); - ui.colored_label( - Color32::RED, - "Please enter a valid npub, public hex key or nip05", - ); - } - - if let Some(keypair) = key_state.check_for_successful_login() { - key_state.should_create_new(); - to_tl(keypair.pubkey).take_as_response(self.ndb, self.cur_account) + if ui.add(add_column_button()).clicked() { + to_option(keypair.pubkey).take_as_response(self.ndb, self.cur_account) + } else { + None + } } else { None - } + }; + if resp.is_some() { + self.key_state_map.remove(&id); + }; + resp }) .inner } @@ -360,7 +373,7 @@ impl<'a> AddColumnView<'a> { vec.push(ColumnOptionData { title: "Individual", description: "Stay up to date with someone's notes & replies", - icon: egui::include_image!("../../../../assets/icons/notifications_icon_dark_4x.png"), + icon: egui::include_image!("../../../../assets/icons/profile_icon_4x.png"), option: AddColumnOption::UndecidedIndividual, }); @@ -410,9 +423,7 @@ impl<'a> AddColumnView<'a> { vec.push(ColumnOptionData { title: "Your Notes", description: "Keep track of your notes & replies", - icon: egui::include_image!( - "../../../../assets/icons/notifications_icon_dark_4x.png" - ), + icon: egui::include_image!("../../../../assets/icons/profile_icon_4x.png"), option: AddColumnOption::Individual(source), }); } @@ -420,7 +431,7 @@ impl<'a> AddColumnView<'a> { vec.push(ColumnOptionData { title: "Someone else's Notes", description: "Stay up to date with someone else's notes & replies", - icon: egui::include_image!("../../../../assets/icons/notifications_icon_dark_4x.png"), + icon: egui::include_image!("../../../../assets/icons/profile_icon_4x.png"), option: AddColumnOption::ExternalIndividual, }); @@ -428,6 +439,31 @@ impl<'a> AddColumnView<'a> { } } +fn find_user_button() -> impl Widget { + sized_button("Find User") +} + +fn add_column_button() -> impl Widget { + sized_button("Add") +} + +fn sized_button(text: &str) -> impl Widget + '_ { + move |ui: &mut egui::Ui| -> egui::Response { + let painter = ui.painter(); + let galley = painter.layout( + text.to_owned(), + NotedeckTextStyle::Body.get_font_id(ui.ctx()), + Color32::WHITE, + ui.available_width(), + ); + + ui.add_sized( + galley.rect.expand2(vec2(16.0, 8.0)).size(), + Button::new(galley).rounding(8.0).fill(crate::colors::PINK), + ) + } +} + struct ColumnOptionData { title: &'static str, description: &'static str, @@ -445,6 +481,7 @@ pub fn render_add_column_routes( let mut add_column_view = AddColumnView::new( &mut app.view_state.id_state_map, ctx.ndb, + ctx.img_cache, ctx.accounts.get_selected_account(), ); let resp = match route { @@ -519,7 +556,7 @@ pub fn hashtag_ui( id_string_map: &mut HashMap, ) -> Option { padding(16.0, ui, |ui| { - let id = ui.id().with("hashtag"); + let id = ui.id().with("hashtag)"); let text_buffer = id_string_map.entry(id).or_default(); let text_edit = egui::TextEdit::singleline(text_buffer) @@ -535,10 +572,7 @@ pub fn hashtag_ui( ui.add_space(8.0); if ui - .add_sized( - egui::vec2(50.0, 40.0), - Button::new("Add").rounding(8.0).fill(crate::colors::PINK), - ) + .add_sized(egui::vec2(50.0, 40.0), add_column_button()) .clicked() { let resp = AddColumnOption::Hashtag(text_buffer.to_owned()).take_as_response(ndb, None);