threads: check for new notes locally when thread is re-opened

We have a NoteRef cache for threads in memory, which is just a list of
NoteKeys and timestamps.

When reopening a thread, query the local DB to see if there are any new
notes that we might have missed because we weren't actively subscribed
to them.

Signed-off-by: William Casarin <jb55@jb55.com>
This commit is contained in:
William Casarin
2024-07-29 10:48:16 -05:00
parent 5be6b1ca68
commit 593df9145b
6 changed files with 160 additions and 70 deletions

View File

@@ -79,7 +79,11 @@ impl<'a> ThreadView<'a> {
}
let (len, list) = {
let thread = self.app.threads.thread_mut(&self.app.ndb, &txn, root_id);
let thread = self
.app
.threads
.thread_mut(&self.app.ndb, &txn, root_id)
.get_ptr();
let len = thread.view.notes.len();
(len, &mut thread.view.list)
@@ -92,7 +96,11 @@ impl<'a> ThreadView<'a> {
ui.spacing_mut().item_spacing.x = 4.0;
let note_key = {
let thread = self.app.threads.thread_mut(&self.app.ndb, &txn, root_id);
let thread = self
.app
.threads
.thread_mut(&self.app.ndb, &txn, root_id)
.get_ptr();
thread.view.notes[start_index].key
};

View File

@@ -1,4 +1,4 @@
use crate::{draft::DraftSource, ui, ui::note::PostAction, Damus};
use crate::{actionbar::BarResult, draft::DraftSource, ui, ui::note::PostAction, Damus};
use egui::containers::scroll_area::ScrollBarVisibility;
use egui::{Direction, Layout};
use egui_tabs::TabColor;
@@ -56,6 +56,7 @@ fn timeline_ui(ui: &mut egui::Ui, app: &mut Damus, timeline: usize, reversed: bo
.show(ui, |ui| {
let view = app.timelines[timeline].current_view();
let len = view.notes.len();
let mut bar_result: Option<BarResult> = None;
view.list
.clone()
.borrow_mut()
@@ -92,7 +93,10 @@ fn timeline_ui(ui: &mut egui::Ui, app: &mut Damus, timeline: usize, reversed: bo
.show(ui);
if let Some(action) = resp.action {
action.execute(app, timeline, note.id(), &txn);
let br = action.execute(app, timeline, note.id(), &txn);
if br.is_some() {
bar_result = br;
}
} else if resp.response.clicked() {
debug!("clicked note");
}
@@ -103,6 +107,16 @@ fn timeline_ui(ui: &mut egui::Ui, app: &mut Damus, timeline: usize, reversed: bo
1
});
if let Some(br) = bar_result {
match br {
// update the thread for next render if we have new notes
BarResult::NewThreadNotes(notes) => {
let view = app.timelines[timeline].current_view_mut();
view.insert(&notes);
}
}
}
});
}