notedeck

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

commit 1c547bbcaa158eaa52d2c592289b2578caaabafa
parent d4082eb818613d348da4771ea18c96fc218bb1d4
Author: kernelkind <kernelkind@gmail.com>
Date:   Thu, 17 Jul 2025 21:25:09 -0400

bugfix: unsubscribe from timelines on deck deletion

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

Diffstat:
Mcrates/notedeck_columns/src/decks.rs | 39+++++++++++++++++++++++++++++++++++++--
Mcrates/notedeck_columns/src/nav.rs | 7++++++-
2 files changed, 43 insertions(+), 3 deletions(-)

diff --git a/crates/notedeck_columns/src/decks.rs b/crates/notedeck_columns/src/decks.rs @@ -265,10 +265,25 @@ impl Decks { } } - pub fn remove_deck(&mut self, index: usize) { + pub fn remove_deck( + &mut self, + index: usize, + timeline_cache: &mut TimelineCache, + ndb: &mut nostrdb::Ndb, + pool: &mut enostr::RelayPool, + ) { + let Some(deck) = self.remove_deck_internal(index) else { + return; + }; + + delete_deck(deck, timeline_cache, ndb, pool); + } + + fn remove_deck_internal(&mut self, index: usize) -> Option<Deck> { + let mut res = None; if index < self.decks.len() { if self.decks.len() > 1 { - self.decks.remove(index); + res = Some(self.decks.remove(index)); let info_prefix = format!("Removed deck at index {index}"); match index.cmp(&self.active_deck) { @@ -311,6 +326,26 @@ impl Decks { } else { error!("index was out of bounds"); } + res + } +} + +fn delete_deck( + mut deck: Deck, + timeline_cache: &mut TimelineCache, + ndb: &mut nostrdb::Ndb, + pool: &mut enostr::RelayPool, +) { + let cols = deck.columns_mut(); + let num_cols = cols.num_columns(); + for i in (0..num_cols).rev() { + let kinds_to_pop = cols.delete_column(i); + + for kind in &kinds_to_pop { + if let Err(err) = timeline_cache.pop(kind, ndb, pool) { + error!("error popping timeline: {err}"); + } + } } } diff --git a/crates/notedeck_columns/src/nav.rs b/crates/notedeck_columns/src/nav.rs @@ -119,7 +119,12 @@ impl SwitchingAction { get_decks_mut(ctx.accounts, decks_cache).set_active(index) } DecksAction::Removing(index) => { - get_decks_mut(ctx.accounts, decks_cache).remove_deck(index) + get_decks_mut(ctx.accounts, decks_cache).remove_deck( + index, + timeline_cache, + ctx.ndb, + ctx.pool, + ); } }, }