notedeck

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

commit 6545e1ddee7d8a67bc7dabd4525939ce0f4dcad8
parent 19933c84f1094c89db2bfa8df73d599a1f1bfba4
Author: William Casarin <jb55@jb55.com>
Date:   Mon, 18 Nov 2024 17:28:55 -0800

thread: ensure thread unknowns are handled

Diffstat:
Msrc/nav.rs | 1+
Msrc/notes_holder.rs | 1+
Msrc/timeline/route.rs | 17+++++++++++++----
Msrc/ui/thread.rs | 13++++++++++---
4 files changed, 25 insertions(+), 7 deletions(-)

diff --git a/src/nav.rs b/src/nav.rs @@ -75,6 +75,7 @@ pub fn render_nav(col: usize, app: &mut Damus, ui: &mut egui::Ui) -> Option<Rend &mut app.pool, &mut app.drafts, &mut app.img_cache, + &mut app.unknown_ids, &mut app.note_cache, &mut app.threads, &mut app.accounts, diff --git a/src/notes_holder.rs b/src/notes_holder.rs @@ -109,6 +109,7 @@ pub trait NotesHolder { notes: Vec<NoteRef>, ) -> Self; + #[must_use = "process_action must be handled in the Ok(action) case"] fn poll_notes_into_view( &mut self, txn: &Transaction, diff --git a/src/timeline/route.rs b/src/timeline/route.rs @@ -16,6 +16,7 @@ use crate::{ }, profile::ProfileView, }, + unknowns::UnknownIds, }; use enostr::{NoteId, Pubkey, RelayPool}; @@ -47,6 +48,7 @@ pub fn render_timeline_route( pool: &mut RelayPool, drafts: &mut Drafts, img_cache: &mut ImageCache, + unknown_ids: &mut UnknownIds, note_cache: &mut NoteCache, threads: &mut NotesHolderStorage<Thread>, accounts: &mut AccountManager, @@ -93,10 +95,17 @@ pub fn render_timeline_route( } TimelineRoute::Thread(id) => { - let timeline_response = - ui::ThreadView::new(threads, ndb, note_cache, img_cache, id.bytes(), textmode) - .id_source(egui::Id::new(("threadscroll", col))) - .ui(ui); + let timeline_response = ui::ThreadView::new( + threads, + ndb, + note_cache, + unknown_ids, + img_cache, + id.bytes(), + textmode, + ) + .id_source(egui::Id::new(("threadscroll", col))) + .ui(ui); if let Some(bar_action) = timeline_response.bar_action { let txn = Transaction::new(ndb).expect("txn"); let mut cur_column = columns.columns_mut(); diff --git a/src/ui/thread.rs b/src/ui/thread.rs @@ -5,6 +5,7 @@ use crate::{ notes_holder::{NotesHolder, NotesHolderStorage}, thread::Thread, ui::note::NoteOptions, + unknowns::UnknownIds, }; use nostrdb::{Ndb, NoteKey, Transaction}; use tracing::error; @@ -15,6 +16,7 @@ pub struct ThreadView<'a> { threads: &'a mut NotesHolderStorage<Thread>, ndb: &'a Ndb, note_cache: &'a mut NoteCache, + unknown_ids: &'a mut UnknownIds, img_cache: &'a mut ImageCache, selected_note_id: &'a [u8; 32], textmode: bool, @@ -27,6 +29,7 @@ impl<'a> ThreadView<'a> { threads: &'a mut NotesHolderStorage<Thread>, ndb: &'a Ndb, note_cache: &'a mut NoteCache, + unknown_ids: &'a mut UnknownIds, img_cache: &'a mut ImageCache, selected_note_id: &'a [u8; 32], textmode: bool, @@ -36,6 +39,7 @@ impl<'a> ThreadView<'a> { threads, ndb, note_cache, + unknown_ids, img_cache, selected_note_id, textmode, @@ -99,9 +103,12 @@ impl<'a> ThreadView<'a> { // TODO(jb55): skip poll if ThreadResult is fresh? // poll for new notes and insert them into our existing notes - if let Err(e) = thread.poll_notes_into_view(&txn, self.ndb) { - error!("Thread::poll_notes_into_view: {e}"); - } + match thread.poll_notes_into_view(&txn, self.ndb) { + Ok(action) => { + action.process_action(&txn, self.ndb, self.unknown_ids, self.note_cache) + } + Err(err) => error!("{err}"), + }; // This is threadview. We are not the universe view... let is_universe = false;