notedeck

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

commit 10eedc0ca642b3af64a80eba47d6c374fe2716c6
parent b285be97a14c7ce485b8646084cb9603e053c51f
Author: William Casarin <jb55@jb55.com>
Date:   Wed, 23 Jul 2025 08:53:14 -0700

Merge contact list fixes by kernel #998

kernelkind (2):
      appease clippy
      fix: sometimes most recent contacts list wasn't used

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 @@ -15,6 +15,7 @@ pub enum ContactState { Received { contacts: HashSet<Pubkey>, note_key: NoteKey, + timestamp: u64, }, } @@ -57,6 +58,7 @@ impl Contacts { ContactState::Received { contacts, note_key: _, + timestamp: _, } => { if contacts.contains(other_pubkey) { IsFollowing::Yes @@ -82,6 +84,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); } @@ -96,11 +110,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 @@ -607,6 +607,7 @@ pub fn fetch_contact_list( ContactState::Received { contacts: _, note_key: _, + timestamp: _, } => FilterState::GotRemote(filter::GotRemoteType::Contact), }; @@ -726,6 +727,7 @@ pub fn is_timeline_ready( let ContactState::Received { contacts: _, note_key, + timestamp: _, } = accounts.get_selected_account().data.contacts.get_state() else { return false;