Fix 0 notes versions being always unread (#9030)

Conrad Irwin , Max , and Nathan created

Co-Authored-By: Max <max@zed.dev>
Co-Authored-By: Nathan <nathan@zed.dev>

Release Notes:

- Fixed empty notes always showing as unread

Co-authored-by: Max <max@zed.dev>
Co-authored-by: Nathan <nathan@zed.dev>

Change summary

crates/channel/src/channel_store.rs | 59 ++++++++++++------------------
1 file changed, 24 insertions(+), 35 deletions(-)

Detailed changes

crates/channel/src/channel_store.rs 🔗

@@ -29,7 +29,7 @@ pub fn init(client: &Arc<Client>, user_store: Model<UserStore>, cx: &mut AppCont
     cx.set_global(GlobalChannelStore(channel_store));
 }
 
-#[derive(Debug, Clone, Default)]
+#[derive(Debug, Clone, Default, PartialEq)]
 struct NotesVersion {
     epoch: u64,
     version: clock::Global,
@@ -81,12 +81,12 @@ pub struct Channel {
     pub parent_path: Vec<ChannelId>,
 }
 
-#[derive(Default)]
+#[derive(Default, Debug)]
 pub struct ChannelState {
     latest_chat_message: Option<u64>,
-    latest_notes_versions: Option<NotesVersion>,
+    latest_notes_version: NotesVersion,
+    observed_notes_version: NotesVersion,
     observed_chat_message: Option<u64>,
-    observed_notes_versions: Option<NotesVersion>,
     role: Option<ChannelRole>,
     projects: HashSet<HostedProjectId>,
 }
@@ -1236,19 +1236,12 @@ impl ChannelState {
     }
 
     fn has_channel_buffer_changed(&self) -> bool {
-        if let Some(latest_version) = &self.latest_notes_versions {
-            if let Some(observed_version) = &self.observed_notes_versions {
-                latest_version.epoch > observed_version.epoch
-                    || (latest_version.epoch == observed_version.epoch
-                        && latest_version
-                            .version
-                            .changed_since(&observed_version.version))
-            } else {
-                true
-            }
-        } else {
-            false
-        }
+        self.latest_notes_version.epoch > self.observed_notes_version.epoch
+            || (self.latest_notes_version.epoch == self.observed_notes_version.epoch
+                && self
+                    .latest_notes_version
+                    .version
+                    .changed_since(&self.observed_notes_version.version))
     }
 
     fn has_new_messages(&self) -> bool {
@@ -1275,29 +1268,25 @@ impl ChannelState {
     }
 
     fn acknowledge_notes_version(&mut self, epoch: u64, version: &clock::Global) {
-        if let Some(existing) = &mut self.observed_notes_versions {
-            if existing.epoch == epoch {
-                existing.version.join(version);
-                return;
-            }
+        if self.observed_notes_version.epoch == epoch {
+            self.observed_notes_version.version.join(version);
+        } else {
+            self.observed_notes_version = NotesVersion {
+                epoch,
+                version: version.clone(),
+            };
         }
-        self.observed_notes_versions = Some(NotesVersion {
-            epoch,
-            version: version.clone(),
-        });
     }
 
     fn update_latest_notes_version(&mut self, epoch: u64, version: &clock::Global) {
-        if let Some(existing) = &mut self.latest_notes_versions {
-            if existing.epoch == epoch {
-                existing.version.join(version);
-                return;
-            }
+        if self.latest_notes_version.epoch == epoch {
+            self.latest_notes_version.version.join(version);
+        } else {
+            self.latest_notes_version = NotesVersion {
+                epoch,
+                version: version.clone(),
+            };
         }
-        self.latest_notes_versions = Some(NotesVersion {
-            epoch,
-            version: version.clone(),
-        });
     }
 
     fn add_hosted_project(&mut self, project_id: HostedProjectId) {