notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit 397bfce8173caa7226551ad80988a26da896ec8d
parent e2295172a28476704e1c99bd4b43ac6190b96e48
Author: kernelkind <kernelkind@gmail.com>
Date:   Mon, 14 Jul 2025 20:42:09 -0400

add `Accounts` to `NoteContext`

Signed-off-by: kernelkind <kernelkind@gmail.com>

Diffstat:
Mcrates/notedeck/src/note/mod.rs | 2++
Mcrates/notedeck_columns/src/nav.rs | 7+++----
Mcrates/notedeck_columns/src/timeline/route.rs | 21+++++++--------------
Mcrates/notedeck_columns/src/ui/note/post.rs | 9++-------
Mcrates/notedeck_columns/src/ui/note/reply.rs | 27++++++++-------------------
Mcrates/notedeck_columns/src/ui/profile/mod.rs | 8++------
Mcrates/notedeck_columns/src/ui/search/mod.rs | 6+-----
Mcrates/notedeck_columns/src/ui/thread.rs | 26++++----------------------
Mcrates/notedeck_columns/src/ui/timeline.rs | 27+++------------------------
Mcrates/notedeck_dave/src/ui/dave.rs | 2+-
Mcrates/notedeck_ui/src/note/contents.rs | 22+++++++---------------
Mcrates/notedeck_ui/src/note/mod.rs | 74++++++++++++++++++++++++++++----------------------------------------------
Mcrates/notedeck_ui/src/note/reply_description.rs | 4+---
13 files changed, 69 insertions(+), 166 deletions(-)

diff --git a/crates/notedeck/src/note/mod.rs b/crates/notedeck/src/note/mod.rs @@ -4,6 +4,7 @@ mod context; pub use action::{MediaAction, NoteAction, ScrollInfo, ZapAction, ZapTargetAmount}; pub use context::{BroadcastContext, ContextSelection, NoteContextSelection}; +use crate::Accounts; use crate::JobPool; use crate::UnknownIds; use crate::{notecache::NoteCache, zaps::Zaps, Images}; @@ -17,6 +18,7 @@ use std::fmt; /// passed to inner UI elements, minimizing prop drilling. pub struct NoteContext<'d> { pub ndb: &'d Ndb, + pub accounts: &'d Accounts, pub img_cache: &'d mut Images, pub note_cache: &'d mut NoteCache, pub zaps: &'d mut Zaps, diff --git a/crates/notedeck_columns/src/nav.rs b/crates/notedeck_columns/src/nav.rs @@ -424,8 +424,10 @@ fn render_nav_body( col: usize, inner_rect: egui::Rect, ) -> Option<RenderNavAction> { + let current_account_has_wallet = get_current_wallet(ctx.accounts, ctx.global_wallet).is_some(); let mut note_context = NoteContext { ndb: ctx.ndb, + accounts: ctx.accounts, img_cache: ctx.img_cache, note_cache: ctx.note_cache, zaps: ctx.zaps, @@ -433,12 +435,11 @@ fn render_nav_body( job_pool: ctx.job_pool, unknown_ids: ctx.unknown_ids, clipboard: ctx.clipboard, - current_account_has_wallet: get_current_wallet(ctx.accounts, ctx.global_wallet).is_some(), + current_account_has_wallet, }; match top { Route::Timeline(kind) => render_timeline_route( &mut app.timeline_cache, - ctx.accounts, kind, col, app.note_options, @@ -449,7 +450,6 @@ fn render_nav_body( ), Route::Thread(selection) => render_thread_route( &mut app.threads, - ctx.accounts, selection, col, app.note_options, @@ -602,7 +602,6 @@ fn render_nav_body( app.note_options, search_buffer, &mut note_context, - &(&ctx.accounts.get_selected_account().key).into(), &mut app.jobs, ) .show(ui) diff --git a/crates/notedeck_columns/src/timeline/route.rs b/crates/notedeck_columns/src/timeline/route.rs @@ -6,13 +6,12 @@ use crate::{ }; use enostr::Pubkey; -use notedeck::{Accounts, MuteFun, NoteContext}; +use notedeck::{MuteFun, NoteContext}; use notedeck_ui::{jobs::JobsCache, NoteOptions}; #[allow(clippy::too_many_arguments)] pub fn render_timeline_route( timeline_cache: &mut TimelineCache, - accounts: &mut Accounts, kind: &TimelineKind, col: usize, note_options: NoteOptions, @@ -32,10 +31,9 @@ pub fn render_timeline_route( let note_action = ui::TimelineView::new( kind, timeline_cache, - &accounts.mutefun(), + &note_context.accounts.mutefun(), note_context, note_options, - &(&accounts.get_selected_account().key).into(), jobs, ) .ui(ui); @@ -47,11 +45,10 @@ pub fn render_timeline_route( if depth > 1 { render_profile_route( pubkey, - accounts, timeline_cache, col, ui, - &accounts.mutefun(), + &note_context.accounts.mutefun(), note_options, note_context, jobs, @@ -61,10 +58,9 @@ pub fn render_timeline_route( let note_action = ui::TimelineView::new( kind, timeline_cache, - &accounts.mutefun(), + &note_context.accounts.mutefun(), note_context, note_options, - &(&accounts.get_selected_account().key).into(), jobs, ) .ui(ui); @@ -78,7 +74,6 @@ pub fn render_timeline_route( #[allow(clippy::too_many_arguments)] pub fn render_thread_route( threads: &mut Threads, - accounts: &mut Accounts, selection: &ThreadSelection, col: usize, mut note_options: NoteOptions, @@ -94,9 +89,8 @@ pub fn render_thread_route( threads, selection.selected_or_root(), note_options, - &accounts.mutefun(), + &note_context.accounts.mutefun(), note_context, - &(&accounts.get_selected_account().key).into(), jobs, ) .id_source(col) @@ -107,7 +101,6 @@ pub fn render_thread_route( #[allow(clippy::too_many_arguments)] pub fn render_profile_route( pubkey: &Pubkey, - accounts: &Accounts, timeline_cache: &mut TimelineCache, col: usize, ui: &mut egui::Ui, @@ -118,7 +111,6 @@ pub fn render_profile_route( ) -> Option<RenderNavAction> { let profile_view = ProfileView::new( pubkey, - accounts, col, timeline_cache, note_options, @@ -130,7 +122,8 @@ pub fn render_profile_route( if let Some(action) = profile_view { match action { - ui::profile::ProfileViewAction::EditProfile => accounts + ui::profile::ProfileViewAction::EditProfile => note_context + .accounts .get_full(pubkey) .map(|kp| RenderNavAction::ProfileAction(ProfileAction::Edit(kp.to_full()))), ui::profile::ProfileViewAction::Note(note_action) => { diff --git a/crates/notedeck_columns/src/ui/note/post.rs b/crates/notedeck_columns/src/ui/note/post.rs @@ -12,7 +12,7 @@ use egui::{ widgets::text_edit::TextEdit, Frame, Layout, Margin, Pos2, ScrollArea, Sense, TextBuffer, }; -use enostr::{FilledKeypair, FullKeypair, KeypairUnowned, NoteId, Pubkey, RelayPool}; +use enostr::{FilledKeypair, FullKeypair, NoteId, Pubkey, RelayPool}; use nostrdb::{Ndb, Transaction}; use notedeck_ui::{ app_images, @@ -352,15 +352,9 @@ impl<'a, 'd> PostView<'a, 'd> { ui.vertical(|ui| { ui.set_max_width(avail_size.x * 0.8); - let zapping_acc = self - .note_context - .current_account_has_wallet - .then(|| KeypairUnowned::from(&self.poster)); - render_note_preview( ui, self.note_context, - zapping_acc.as_ref(), txn, id.bytes(), nostrdb::NoteKey::new(0), @@ -793,6 +787,7 @@ mod preview { let txn = Transaction::new(app.ndb).expect("txn"); let mut note_context = NoteContext { ndb: app.ndb, + accounts: app.accounts, img_cache: app.img_cache, note_cache: app.note_cache, zaps: app.zaps, diff --git a/crates/notedeck_columns/src/ui/note/reply.rs b/crates/notedeck_columns/src/ui/note/reply.rs @@ -4,7 +4,7 @@ use crate::ui::{ note::{PostAction, PostResponse, PostType}, }; -use enostr::{FilledKeypair, KeypairUnowned, NoteId}; +use enostr::{FilledKeypair, NoteId}; use notedeck::NoteContext; use notedeck_ui::jobs::JobsCache; use notedeck_ui::{NoteOptions, NoteView, ProfilePic}; @@ -67,27 +67,16 @@ impl<'a, 'd> PostReplyView<'a, 'd> { let note_offset: i8 = pfp_offset - ProfilePic::medium_size() / 2 - NoteView::expand_size() / 2; - let zapping_acc = self - .note_context - .current_account_has_wallet - .then(|| KeypairUnowned::from(&self.poster)); - let quoted_note = egui::Frame::NONE .outer_margin(egui::Margin::same(note_offset)) .show(ui, |ui| { - NoteView::new( - self.note_context, - zapping_acc.as_ref(), - self.note, - self.note_options, - self.jobs, - ) - .truncate(false) - .selectable_text(true) - .actionbar(false) - .medium_pfp(true) - .options_button(true) - .show(ui) + NoteView::new(self.note_context, self.note, self.note_options, self.jobs) + .truncate(false) + .selectable_text(true) + .actionbar(false) + .medium_pfp(true) + .options_button(true) + .show(ui) }) .inner; diff --git a/crates/notedeck_columns/src/ui/profile/mod.rs b/crates/notedeck_columns/src/ui/profile/mod.rs @@ -12,7 +12,7 @@ use crate::{ ui::timeline::{tabs_ui, TimelineTabView}, }; use notedeck::{ - name::get_display_name, profile::get_profile_url, Accounts, IsFollowing, MuteFun, NoteAction, + name::get_display_name, profile::get_profile_url, IsFollowing, MuteFun, NoteAction, NoteContext, NotedeckTextStyle, }; use notedeck_ui::{ @@ -24,7 +24,6 @@ use notedeck_ui::{ pub struct ProfileView<'a, 'd> { pubkey: &'a Pubkey, - accounts: &'a Accounts, col_id: usize, timeline_cache: &'a mut TimelineCache, note_options: NoteOptions, @@ -44,7 +43,6 @@ impl<'a, 'd> ProfileView<'a, 'd> { #[allow(clippy::too_many_arguments)] pub fn new( pubkey: &'a Pubkey, - accounts: &'a Accounts, col_id: usize, timeline_cache: &'a mut TimelineCache, note_options: NoteOptions, @@ -54,7 +52,6 @@ impl<'a, 'd> ProfileView<'a, 'd> { ) -> Self { ProfileView { pubkey, - accounts, col_id, timeline_cache, note_options, @@ -118,7 +115,6 @@ impl<'a, 'd> ProfileView<'a, 'd> { &txn, self.is_muted, self.note_context, - &(&self.accounts.get_selected_account().key).into(), self.jobs, ) .show(ui) @@ -179,7 +175,7 @@ impl<'a, 'd> ProfileView<'a, 'd> { ui.add_space(24.0); let target_key = self.pubkey; - let selected = self.accounts.get_selected_account(); + let selected = self.note_context.accounts.get_selected_account(); let profile_type = if selected.key.secret_key.is_none() { ProfileType::ReadOnly diff --git a/crates/notedeck_columns/src/ui/search/mod.rs b/crates/notedeck_columns/src/ui/search/mod.rs @@ -1,5 +1,5 @@ use egui::{vec2, Align, Color32, CornerRadius, RichText, Stroke, TextEdit}; -use enostr::{KeypairUnowned, NoteId, Pubkey}; +use enostr::{NoteId, Pubkey}; use state::TypingType; use crate::{timeline::TimelineTab, ui::timeline::TimelineTabView}; @@ -27,7 +27,6 @@ pub struct SearchView<'a, 'd> { txn: &'a Transaction, is_muted: &'a MuteFun, note_context: &'a mut NoteContext<'d>, - cur_acc: &'a KeypairUnowned<'a>, jobs: &'a mut JobsCache, } @@ -38,7 +37,6 @@ impl<'a, 'd> SearchView<'a, 'd> { note_options: NoteOptions, query: &'a mut SearchQueryState, note_context: &'a mut NoteContext<'d>, - cur_acc: &'a KeypairUnowned<'a>, jobs: &'a mut JobsCache, ) -> Self { Self { @@ -47,7 +45,6 @@ impl<'a, 'd> SearchView<'a, 'd> { query, note_options, note_context, - cur_acc, jobs, } } @@ -157,7 +154,6 @@ impl<'a, 'd> SearchView<'a, 'd> { self.txn, self.is_muted, self.note_context, - self.cur_acc, self.jobs, ) .show(ui) diff --git a/crates/notedeck_columns/src/ui/thread.rs b/crates/notedeck_columns/src/ui/thread.rs @@ -1,6 +1,5 @@ use egui::InnerResponse; use egui_virtual_list::VirtualList; -use enostr::KeypairUnowned; use nostrdb::{Note, Transaction}; use notedeck::note::root_note_id_from_selected_id; use notedeck::{MuteFun, NoteAction, NoteContext}; @@ -18,7 +17,6 @@ pub struct ThreadView<'a, 'd> { id_source: egui::Id, is_muted: &'a MuteFun, note_context: &'a mut NoteContext<'d>, - cur_acc: &'a KeypairUnowned<'a>, jobs: &'a mut JobsCache, } @@ -30,7 +28,6 @@ impl<'a, 'd> ThreadView<'a, 'd> { note_options: NoteOptions, is_muted: &'a MuteFun, note_context: &'a mut NoteContext<'d>, - cur_acc: &'a KeypairUnowned<'a>, jobs: &'a mut JobsCache, ) -> Self { let id_source = egui::Id::new("threadscroll_threadview"); @@ -41,7 +38,6 @@ impl<'a, 'd> ThreadView<'a, 'd> { id_source, is_muted, note_context, - cur_acc, jobs, col: 0, } @@ -134,17 +130,11 @@ impl<'a, 'd> ThreadView<'a, 'd> { ui.colored_label(ui.visuals().error_fg_color, "LOADING NOTES"); } - let zapping_acc = self - .note_context - .current_account_has_wallet - .then_some(self.cur_acc); - show_notes( ui, list, &notes, self.note_context, - zapping_acc, self.note_options, self.jobs, txn, @@ -159,7 +149,6 @@ fn show_notes( list: &mut VirtualList, thread_notes: &ThreadNotes, note_context: &mut NoteContext<'_>, - zapping_acc: Option<&KeypairUnowned<'_>>, flags: NoteOptions, jobs: &mut JobsCache, txn: &Transaction, @@ -190,7 +179,7 @@ fn show_notes( return 1; } - let resp = note.show(note_context, zapping_acc, flags, jobs, ui); + let resp = note.show(note_context, flags, jobs, ui); action = if cur_index == selected_note_index { resp.action.and_then(strip_note_action) @@ -313,21 +302,14 @@ impl<'a> ThreadNote<'a> { fn show( &self, note_context: &'a mut NoteContext<'_>, - zapping_acc: Option<&'a KeypairUnowned<'a>>, flags: NoteOptions, jobs: &'a mut JobsCache, ui: &mut egui::Ui, ) -> NoteResponse { let inner = notedeck_ui::padding(8.0, ui, |ui| { - NoteView::new( - note_context, - zapping_acc, - &self.note, - self.options(flags), - jobs, - ) - .unread_indicator(self.unread_and_have_replies) - .show(ui) + NoteView::new(note_context, &self.note, self.options(flags), jobs) + .unread_indicator(self.unread_and_have_replies) + .show(ui) }); match self.note_type { diff --git a/crates/notedeck_columns/src/ui/timeline.rs b/crates/notedeck_columns/src/ui/timeline.rs @@ -1,7 +1,6 @@ use egui::containers::scroll_area::ScrollBarVisibility; use egui::{vec2, Direction, Layout, Pos2, Stroke}; use egui_tabs::TabColor; -use enostr::KeypairUnowned; use nostrdb::Transaction; use notedeck::ui::is_narrow; use notedeck_ui::jobs::JobsCache; @@ -22,7 +21,6 @@ pub struct TimelineView<'a, 'd> { reverse: bool, is_muted: &'a MuteFun, note_context: &'a mut NoteContext<'d>, - cur_acc: &'a KeypairUnowned<'a>, jobs: &'a mut JobsCache, } @@ -34,7 +32,6 @@ impl<'a, 'd> TimelineView<'a, 'd> { is_muted: &'a MuteFun, note_context: &'a mut NoteContext<'d>, note_options: NoteOptions, - cur_acc: &'a KeypairUnowned<'a>, jobs: &'a mut JobsCache, ) -> Self { let reverse = false; @@ -45,7 +42,6 @@ impl<'a, 'd> TimelineView<'a, 'd> { reverse, is_muted, note_context, - cur_acc, jobs, } } @@ -59,7 +55,6 @@ impl<'a, 'd> TimelineView<'a, 'd> { self.note_options, self.is_muted, self.note_context, - self.cur_acc, self.jobs, ) } @@ -79,7 +74,6 @@ fn timeline_ui( note_options: NoteOptions, is_muted: &MuteFun, note_context: &mut NoteContext, - cur_acc: &KeypairUnowned, jobs: &mut JobsCache, ) -> Option<NoteAction> { //padding(4.0, ui, |ui| ui.heading("Notifications")); @@ -169,7 +163,6 @@ fn timeline_ui( &txn, is_muted, note_context, - cur_acc, jobs, ) .show(ui) @@ -354,7 +347,6 @@ pub struct TimelineTabView<'a, 'd> { txn: &'a Transaction, is_muted: &'a MuteFun, note_context: &'a mut NoteContext<'d>, - cur_acc: &'a KeypairUnowned<'a>, jobs: &'a mut JobsCache, } @@ -367,7 +359,6 @@ impl<'a, 'd> TimelineTabView<'a, 'd> { txn: &'a Transaction, is_muted: &'a MuteFun, note_context: &'a mut NoteContext<'d>, - cur_acc: &'a KeypairUnowned<'a>, jobs: &'a mut JobsCache, ) -> Self { Self { @@ -377,7 +368,6 @@ impl<'a, 'd> TimelineTabView<'a, 'd> { txn, is_muted, note_context, - cur_acc, jobs, } } @@ -424,21 +414,10 @@ impl<'a, 'd> TimelineTabView<'a, 'd> { }; if !muted { - let zapping_acc = if self.note_context.current_account_has_wallet { - Some(self.cur_acc) - } else { - None - }; - notedeck_ui::padding(8.0, ui, |ui| { - let resp = NoteView::new( - self.note_context, - zapping_acc, - &note, - self.note_options, - self.jobs, - ) - .show(ui); + let resp = + NoteView::new(self.note_context, &note, self.note_options, self.jobs) + .show(ui); if let Some(note_action) = resp.action { action = Some(note_action) diff --git a/crates/notedeck_dave/src/ui/dave.rs b/crates/notedeck_dave/src/ui/dave.rs @@ -211,6 +211,7 @@ impl<'a> DaveUi<'a> { ) -> Option<NoteAction> { let mut note_context = NoteContext { ndb: ctx.ndb, + accounts: ctx.accounts, img_cache: ctx.img_cache, note_cache: ctx.note_cache, zaps: ctx.zaps, @@ -243,7 +244,6 @@ impl<'a> DaveUi<'a> { |ui| { notedeck_ui::NoteView::new( &mut note_context, - None, &note, NoteOptions::default(), jobs, diff --git a/crates/notedeck_ui/src/note/contents.rs b/crates/notedeck_ui/src/note/contents.rs @@ -8,7 +8,6 @@ use crate::{ }; use egui::{Color32, Hyperlink, RichText}; -use enostr::KeypairUnowned; use nostrdb::{BlockType, Mention, Note, NoteKey, Transaction}; use tracing::warn; @@ -18,7 +17,6 @@ use super::media::{find_renderable_media, image_carousel, RenderableMedia}; pub struct NoteContents<'a, 'd> { note_context: &'a mut NoteContext<'d>, - cur_acc: Option<&'a KeypairUnowned<'a>>, txn: &'a Transaction, note: &'a Note<'a>, options: NoteOptions, @@ -30,7 +28,6 @@ impl<'a, 'd> NoteContents<'a, 'd> { #[allow(clippy::too_many_arguments)] pub fn new( note_context: &'a mut NoteContext<'d>, - cur_acc: Option<&'a KeypairUnowned<'a>>, txn: &'a Transaction, note: &'a Note, options: NoteOptions, @@ -38,7 +35,6 @@ impl<'a, 'd> NoteContents<'a, 'd> { ) -> Self { NoteContents { note_context, - cur_acc, txn, note, options, @@ -53,7 +49,6 @@ impl egui::Widget for &mut NoteContents<'_, '_> { let result = render_note_contents( ui, self.note_context, - self.cur_acc, self.txn, self.note, self.options, @@ -71,7 +66,6 @@ impl egui::Widget for &mut NoteContents<'_, '_> { pub fn render_note_preview( ui: &mut egui::Ui, note_context: &mut NoteContext, - cur_acc: Option<&KeypairUnowned>, txn: &Transaction, id: &[u8; 32], parent: NoteKey, @@ -105,7 +99,7 @@ pub fn render_note_preview( */ }; - NoteView::new(note_context, cur_acc, &note, note_options, jobs) + NoteView::new(note_context, &note, note_options, jobs) .preview_style() .parent(parent) .show(ui) @@ -116,7 +110,6 @@ pub fn render_note_preview( pub fn render_note_contents( ui: &mut egui::Ui, note_context: &mut NoteContext, - cur_acc: Option<&KeypairUnowned>, txn: &Transaction, note: &Note, options: NoteOptions, @@ -275,7 +268,7 @@ pub fn render_note_contents( }); let preview_note_action = inline_note.and_then(|(id, _)| { - render_note_preview(ui, note_context, cur_acc, txn, id, note_key, options, jobs) + render_note_preview(ui, note_context, txn, id, note_key, options, jobs) .action .map(|a| match a { NoteAction::Note { note_id, .. } => NoteAction::Note { @@ -291,12 +284,11 @@ pub fn render_note_contents( ui.add_space(2.0); let carousel_id = egui::Id::new(("carousel", note.key().expect("expected tx note"))); - let trusted_media = trust_media_from_pk2( - note_context.ndb, - txn, - cur_acc.as_ref().map(|k| k.pubkey.bytes()), - note.pubkey(), - ); + let zapping_acc = { + let cur_acc = note_context.accounts.get_selected_account(); + cur_acc.wallet.as_ref().map(|_| cur_acc.key.pubkey.bytes()) + }; + let trusted_media = trust_media_from_pk2(note_context.ndb, txn, zapping_acc, note.pubkey()); media_action = image_carousel( ui, diff --git a/crates/notedeck_ui/src/note/mod.rs b/crates/notedeck_ui/src/note/mod.rs @@ -33,7 +33,6 @@ use notedeck::{ pub struct NoteView<'a, 'd> { note_context: &'a mut NoteContext<'d>, - zapping_acc: Option<&'a KeypairUnowned<'a>>, parent: Option<NoteKey>, note: &'a nostrdb::Note<'a>, framed: bool, @@ -85,7 +84,6 @@ impl egui::Widget for &mut NoteView<'_, '_> { impl<'a, 'd> NoteView<'a, 'd> { pub fn new( note_context: &'a mut NoteContext<'d>, - zapping_acc: Option<&'a KeypairUnowned<'a>>, note: &'a nostrdb::Note<'a>, mut flags: NoteOptions, jobs: &'a mut JobsCache, @@ -98,7 +96,6 @@ impl<'a, 'd> NoteView<'a, 'd> { Self { note_context, - zapping_acc, parent, note, flags, @@ -231,7 +228,6 @@ impl<'a, 'd> NoteView<'a, 'd> { ui.add(&mut NoteContents::new( self.note_context, - self.zapping_acc, txn, self.note, self.flags, @@ -317,14 +313,7 @@ impl<'a, 'd> NoteView<'a, 'd> { .text_style(style.text_style()), ); }); - NoteView::new( - self.note_context, - self.zapping_acc, - &note_to_repost, - self.flags, - self.jobs, - ) - .show(ui) + NoteView::new(self.note_context, &note_to_repost, self.flags, self.jobs).show(ui) } pub fn show_impl(&mut self, ui: &mut egui::Ui) -> NoteResponse { @@ -440,7 +429,6 @@ impl<'a, 'd> NoteView<'a, 'd> { ui.horizontal(|ui| { note_action = reply_desc( ui, - self.zapping_acc, txn, &note_reply, self.note_context, @@ -455,32 +443,27 @@ impl<'a, 'd> NoteView<'a, 'd> { }) .inner; - let mut contents = NoteContents::new( - self.note_context, - self.zapping_acc, - txn, - self.note, - self.flags, - self.jobs, - ); + let mut contents = + NoteContents::new(self.note_context, txn, self.note, self.flags, self.jobs); ui.add(&mut contents); note_action = contents.action.or(note_action); if self.options().has(NoteOptions::ActionBar) { - note_action = render_note_actionbar( - ui, - self.zapping_acc.as_ref().map(|c| Zapper { + let zapper = { + let cur_acc = self.note_context.accounts.get_selected_account(); + let has_wallet = cur_acc.wallet.is_some(); + + has_wallet.then_some(Zapper { zaps: self.note_context.zaps, - cur_acc: c, - }), - self.note.id(), - self.note.pubkey(), - note_key, - ) - .inner - .or(note_action); + cur_acc: cur_acc.keypair(), + }) + }; + note_action = + render_note_actionbar(ui, zapper, self.note.id(), self.note.pubkey(), note_key) + .inner + .or(note_action); } NoteUiResponse { @@ -527,7 +510,6 @@ impl<'a, 'd> NoteView<'a, 'd> { note_action = reply_desc( ui, - self.zapping_acc, txn, &note_reply, self.note_context, @@ -537,25 +519,25 @@ impl<'a, 'd> NoteView<'a, 'd> { .or(note_action.take()); }); - let mut contents = NoteContents::new( - self.note_context, - self.zapping_acc, - txn, - self.note, - self.flags, - self.jobs, - ); + let mut contents = + NoteContents::new(self.note_context, txn, self.note, self.flags, self.jobs); ui.add(&mut contents); note_action = contents.action.or(note_action); + let zapper = { + let cur_acc = self.note_context.accounts.get_selected_account(); + let has_wallet = cur_acc.wallet.is_some(); + + has_wallet.then_some(Zapper { + zaps: self.note_context.zaps, + cur_acc: cur_acc.keypair(), + }) + }; if self.options().has(NoteOptions::ActionBar) { note_action = render_note_actionbar( ui, - self.zapping_acc.as_ref().map(|c| Zapper { - zaps: self.note_context.zaps, - cur_acc: c, - }), + zapper, self.note.id(), self.note.pubkey(), note_key, @@ -774,7 +756,7 @@ fn note_hitbox_clicked( struct Zapper<'a> { zaps: &'a Zaps, - cur_acc: &'a KeypairUnowned<'a>, + cur_acc: KeypairUnowned<'a>, } #[profiling::function] diff --git a/crates/notedeck_ui/src/note/reply_description.rs b/crates/notedeck_ui/src/note/reply_description.rs @@ -3,14 +3,12 @@ use nostrdb::{Note, NoteReply, Transaction}; use super::NoteOptions; use crate::{jobs::JobsCache, note::NoteView, Mention}; -use enostr::KeypairUnowned; use notedeck::{NoteAction, NoteContext}; #[must_use = "Please handle the resulting note action"] #[profiling::function] pub fn reply_desc( ui: &mut egui::Ui, - cur_acc: Option<&KeypairUnowned>, txn: &Transaction, note_reply: &NoteReply, note_context: &mut NoteContext, @@ -43,7 +41,7 @@ pub fn reply_desc( if r.hovered() { r.on_hover_ui_at_pointer(|ui| { ui.set_max_width(400.0); - NoteView::new(note_context, cur_acc, note, note_options, jobs) + NoteView::new(note_context, note, note_options, jobs) .actionbar(false) .wide(true) .show(ui);