notedeck

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

commit fdef74c3535639d4ec25d1620aadb12f21b624eb
parent 030e4226f844320f2760db640215c1eda4f7adea
Author: kernelkind <kernelkind@gmail.com>
Date:   Thu, 17 Jul 2025 18:16:06 -0400

fix: sometimes most recent contacts list wasn't used

`ndb::poll_for_notes` appears to give notes as they arrive. We
need to make sure we only use the most recent for contacts

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

Diffstat:
Mcrates/notedeck/src/account/contacts.rs | 22+++++++++++++++++++++-
Mcrates/notedeck_columns/src/profile.rs | 1+
Mcrates/notedeck_columns/src/timeline/mod.rs | 2++
3 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/crates/notedeck/src/account/contacts.rs b/crates/notedeck/src/account/contacts.rs @@ -13,6 +13,7 @@ pub enum ContactState { Received { contacts: HashSet<Pubkey>, note_key: NoteKey, + timestamp: u64, }, } @@ -55,6 +56,7 @@ impl Contacts { ContactState::Received { contacts, note_key: _, + timestamp: _, } => { if contacts.contains(other_pubkey) { IsFollowing::Yes @@ -80,6 +82,18 @@ impl Contacts { } }; + if let ContactState::Received { + contacts: _, + note_key: _, + timestamp, + } = self.get_state() + { + if *timestamp > note.created_at() { + // the current contact list is more up to date than the one we just received. ignore it. + return; + } + } + update_state(&mut self.state, &note, *key); } @@ -94,11 +108,17 @@ fn update_state(state: &mut ContactState, note: &Note, key: NoteKey) { *state = ContactState::Received { contacts: get_contacts_owned(note), note_key: key, + timestamp: note.created_at(), }; } - ContactState::Received { contacts, note_key } => { + ContactState::Received { + contacts, + note_key, + timestamp, + } => { update_contacts(contacts, note); *note_key = key; + *timestamp = note.created_at(); } }; } diff --git a/crates/notedeck_columns/src/profile.rs b/crates/notedeck_columns/src/profile.rs @@ -144,6 +144,7 @@ fn send_kind_3_event(ndb: &Ndb, pool: &mut RelayPool, accounts: &Accounts, actio let ContactState::Received { contacts: _, note_key, + timestamp: _, } = accounts.get_selected_account().data.contacts.get_state() else { return; diff --git a/crates/notedeck_columns/src/timeline/mod.rs b/crates/notedeck_columns/src/timeline/mod.rs @@ -601,6 +601,7 @@ pub fn fetch_contact_list( ContactState::Received { contacts: _, note_key: _, + timestamp: _, } => FilterState::GotRemote(filter::GotRemoteType::Contact), }; @@ -718,6 +719,7 @@ pub fn is_timeline_ready( let ContactState::Received { contacts: _, note_key, + timestamp: _, } = accounts.get_selected_account().data.contacts.get_state() else { return false;