notedeck

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

commit c6dbb0e85607ab2058cb327473d55b5824e56073
parent 48f17f91b85e9e0a353526481aff84a68a1920e2
Author: Fernando López Guevara <fernando.lguevara@gmail.com>
Date:   Mon,  9 Jun 2025 10:51:17 -0300

fix(content): handle case where notes are not loaded

Diffstat:
Mcrates/notedeck/src/note/mod.rs | 2++
Mcrates/notedeck/src/unknowns.rs | 14++++++++++----
Mcrates/notedeck_columns/src/nav.rs | 3+--
Mcrates/notedeck_columns/src/timeline/route.rs | 8+-------
Mcrates/notedeck_columns/src/ui/note/post.rs | 1+
Mcrates/notedeck_columns/src/ui/profile/mod.rs | 7++-----
Mcrates/notedeck_columns/src/ui/thread.rs | 7++-----
Mcrates/notedeck_dave/src/ui/dave.rs | 1+
Mcrates/notedeck_ui/src/note/contents.rs | 4++++
9 files changed, 24 insertions(+), 23 deletions(-)

diff --git a/crates/notedeck/src/note/mod.rs b/crates/notedeck/src/note/mod.rs @@ -5,6 +5,7 @@ pub use action::{MediaAction, NoteAction, ZapAction, ZapTargetAmount}; pub use context::{BroadcastContext, ContextSelection, NoteContextSelection}; use crate::JobPool; +use crate::UnknownIds; use crate::{notecache::NoteCache, zaps::Zaps, Images}; use enostr::{NoteId, RelayPool}; use nostrdb::{Ndb, Note, NoteKey, QueryResult, Transaction}; @@ -21,6 +22,7 @@ pub struct NoteContext<'d> { pub zaps: &'d mut Zaps, pub pool: &'d mut RelayPool, pub job_pool: &'d mut JobPool, + pub unknown_ids: &'d mut UnknownIds, pub current_account_has_wallet: bool, } diff --git a/crates/notedeck/src/unknowns.rs b/crates/notedeck/src/unknowns.rs @@ -201,7 +201,11 @@ impl UnknownIds { return; } - self.ids.entry(UnknownId::Pubkey(*pubkey)).or_default(); + let unknown_id = UnknownId::Pubkey(*pubkey); + if self.ids.contains_key(&unknown_id) { + return; + } + self.ids.entry(unknown_id).or_default(); self.mark_updated(); } @@ -211,9 +215,11 @@ impl UnknownIds { return; } - self.ids - .entry(UnknownId::Id(NoteId::new(*note_id))) - .or_default(); + let unknown_id = UnknownId::Id(NoteId::new(*note_id)); + if self.ids.contains_key(&unknown_id) { + return; + } + self.ids.entry(unknown_id).or_default(); self.mark_updated(); } } diff --git a/crates/notedeck_columns/src/nav.rs b/crates/notedeck_columns/src/nav.rs @@ -420,11 +420,11 @@ fn render_nav_body( zaps: ctx.zaps, pool: ctx.pool, job_pool: ctx.job_pool, + unknown_ids: ctx.unknown_ids, current_account_has_wallet: get_current_wallet(ctx.accounts, ctx.global_wallet).is_some(), }; match top { Route::Timeline(kind) => render_timeline_route( - ctx.unknown_ids, &mut app.timeline_cache, ctx.accounts, kind, @@ -436,7 +436,6 @@ fn render_nav_body( &mut app.jobs, ), Route::Thread(selection) => render_thread_route( - ctx.unknown_ids, &mut app.threads, ctx.accounts, selection, diff --git a/crates/notedeck_columns/src/timeline/route.rs b/crates/notedeck_columns/src/timeline/route.rs @@ -6,12 +6,11 @@ use crate::{ }; use enostr::Pubkey; -use notedeck::{Accounts, MuteFun, NoteContext, UnknownIds}; +use notedeck::{Accounts, MuteFun, NoteContext}; use notedeck_ui::{jobs::JobsCache, NoteOptions}; #[allow(clippy::too_many_arguments)] pub fn render_timeline_route( - unknown_ids: &mut UnknownIds, timeline_cache: &mut TimelineCache, accounts: &mut Accounts, kind: &TimelineKind, @@ -50,7 +49,6 @@ pub fn render_timeline_route( pubkey, accounts, timeline_cache, - unknown_ids, col, ui, &accounts.mutefun(), @@ -79,7 +77,6 @@ pub fn render_timeline_route( #[allow(clippy::too_many_arguments)] pub fn render_thread_route( - unknown_ids: &mut UnknownIds, threads: &mut Threads, accounts: &mut Accounts, selection: &ThreadSelection, @@ -95,7 +92,6 @@ pub fn render_thread_route( ui::ThreadView::new( threads, - unknown_ids, selection.selected_or_root(), note_options, &accounts.mutefun(), @@ -113,7 +109,6 @@ pub fn render_profile_route( pubkey: &Pubkey, accounts: &Accounts, timeline_cache: &mut TimelineCache, - unknown_ids: &mut UnknownIds, col: usize, ui: &mut egui::Ui, is_muted: &MuteFun, @@ -127,7 +122,6 @@ pub fn render_profile_route( col, timeline_cache, note_options, - unknown_ids, is_muted, note_context, jobs, diff --git a/crates/notedeck_columns/src/ui/note/post.rs b/crates/notedeck_columns/src/ui/note/post.rs @@ -785,6 +785,7 @@ mod preview { zaps: app.zaps, pool: app.pool, job_pool: app.job_pool, + unknown_ids: app.unknown_ids, current_account_has_wallet: false, }; 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::{ }; use notedeck::{ name::get_display_name, profile::get_profile_url, Accounts, MuteFun, NoteAction, NoteContext, - NotedeckTextStyle, UnknownIds, + NotedeckTextStyle, }; use notedeck_ui::{ jobs::JobsCache, @@ -26,7 +26,6 @@ pub struct ProfileView<'a, 'd> { col_id: usize, timeline_cache: &'a mut TimelineCache, note_options: NoteOptions, - unknown_ids: &'a mut UnknownIds, is_muted: &'a MuteFun, note_context: &'a mut NoteContext<'d>, jobs: &'a mut JobsCache, @@ -45,7 +44,6 @@ impl<'a, 'd> ProfileView<'a, 'd> { col_id: usize, timeline_cache: &'a mut TimelineCache, note_options: NoteOptions, - unknown_ids: &'a mut UnknownIds, is_muted: &'a MuteFun, note_context: &'a mut NoteContext<'d>, jobs: &'a mut JobsCache, @@ -56,7 +54,6 @@ impl<'a, 'd> ProfileView<'a, 'd> { col_id, timeline_cache, note_options, - unknown_ids, is_muted, note_context, jobs, @@ -103,7 +100,7 @@ impl<'a, 'd> ProfileView<'a, 'd> { if let Err(e) = profile_timeline.poll_notes_into_view( self.note_context.ndb, &txn, - self.unknown_ids, + self.note_context.unknown_ids, self.note_context.note_cache, reversed, ) { diff --git a/crates/notedeck_columns/src/ui/thread.rs b/crates/notedeck_columns/src/ui/thread.rs @@ -3,7 +3,7 @@ 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, UnknownIds}; +use notedeck::{MuteFun, NoteAction, NoteContext}; use notedeck_ui::jobs::JobsCache; use notedeck_ui::note::NoteResponse; use notedeck_ui::{NoteOptions, NoteView}; @@ -12,7 +12,6 @@ use crate::timeline::thread::{NoteSeenFlags, ParentState, Threads}; pub struct ThreadView<'a, 'd> { threads: &'a mut Threads, - unknown_ids: &'a mut UnknownIds, selected_note_id: &'a [u8; 32], note_options: NoteOptions, col: usize, @@ -27,7 +26,6 @@ impl<'a, 'd> ThreadView<'a, 'd> { #[allow(clippy::too_many_arguments)] pub fn new( threads: &'a mut Threads, - unknown_ids: &'a mut UnknownIds, selected_note_id: &'a [u8; 32], note_options: NoteOptions, is_muted: &'a MuteFun, @@ -38,7 +36,6 @@ impl<'a, 'd> ThreadView<'a, 'd> { let id_source = egui::Id::new("threadscroll_threadview"); ThreadView { threads, - unknown_ids, selected_note_id, note_options, id_source, @@ -96,7 +93,7 @@ impl<'a, 'd> ThreadView<'a, 'd> { self.note_context.note_cache, self.note_context.ndb, txn, - self.unknown_ids, + self.note_context.unknown_ids, self.col, ); diff --git a/crates/notedeck_dave/src/ui/dave.rs b/crates/notedeck_dave/src/ui/dave.rs @@ -216,6 +216,7 @@ impl<'a> DaveUi<'a> { zaps: ctx.zaps, pool: ctx.pool, job_pool: ctx.job_pool, + unknown_ids: ctx.unknown_ids, current_account_has_wallet: false, }; diff --git a/crates/notedeck_ui/src/note/contents.rs b/crates/notedeck_ui/src/note/contents.rs @@ -89,6 +89,10 @@ pub fn render_note_preview( )); } } else { + note_context + .unknown_ids + .add_note_id_if_missing(note_context.ndb, txn, id); + return NoteResponse::new(ui.colored_label(Color32::RED, "TODO: COULD NOT LOAD")); /* return ui