Fix live read recipt count (#227)
authorAjay Bura <ajbura@gmail.com>
Mon, 17 Jan 2022 06:50:18 +0000 (12:20 +0530)
committerAjay Bura <ajbura@gmail.com>
Mon, 17 Jan 2022 06:50:18 +0000 (12:20 +0530)
Signed-off-by: Ajay Bura <ajbura@gmail.com>
src/client/state/RoomTimeline.js

index 1a988d64be08280eb348aca9f0835bf9e3f1460b..4f5c803de1e576eb17cbdbcc4bd8c0782f2c8978 100644 (file)
@@ -12,6 +12,20 @@ function isReaction(mEvent) {
   return mEvent.getType() === 'm.reaction';
 }
 
+function hideMemberEvents(mEvent) {
+  const content = mEvent.getContent();
+  const prevContent = mEvent.getPrevContent();
+  const { membership } = content;
+  if (settings.hideMembershipEvents) {
+    if (membership === 'invite' || membership === 'ban' || membership === 'leave') return true;
+    if (prevContent.membership !== 'join') return true;
+  }
+  if (settings.hideNickAvatarEvents) {
+    if (membership === 'join' && prevContent.membership === 'join') return true;
+  }
+  return false;
+}
+
 function getRelateToId(mEvent) {
   const relation = mEvent.getRelation();
   return relation && relation.event_id;
@@ -112,18 +126,8 @@ class RoomTimeline extends EventEmitter {
   }
 
   addToTimeline(mEvent) {
-    if (mEvent.getType() === 'm.room.member' && (settings.hideMembershipEvents || settings.hideNickAvatarEvents)) {
-      const content = mEvent.getContent();
-      const prevContent = mEvent.getPrevContent();
-      const { membership } = content;
-
-      if (settings.hideMembershipEvents) {
-        if (membership === 'invite' || membership === 'ban' || membership === 'leave') return;
-        if (prevContent.membership !== 'join') return;
-      }
-      if (settings.hideNickAvatarEvents) {
-        if (membership === 'join' && prevContent.membership === 'join') return;
-      }
+    if (mEvent.getType() === 'm.room.member' && hideMemberEvents(mEvent)) {
+      return;
     }
     if (mEvent.isRedacted()) return;
     if (isReaction(mEvent)) {
@@ -244,30 +248,38 @@ class RoomTimeline extends EventEmitter {
     return this.room.getUnfilteredTimelineSet();
   }
 
-  getLiveReaders() {
-    const lastEvent = this.timeline[this.timeline.length - 1];
+  getEventReaders(mEvent) {
     const liveEvents = this.liveTimeline.getEvents();
-
     const readers = [];
+    if (!mEvent) return [];
 
     for (let i = liveEvents.length - 1; i >= 0; i -= 1) {
       readers.splice(readers.length, 0, ...this.room.getUsersReadUpTo(liveEvents[i]));
-      if (lastEvent === liveEvents[i]) break;
+      if (mEvent === liveEvents[i]) break;
     }
 
     return [...new Set(readers)];
   }
 
-  getEventReaders(mEvent) {
+  getLiveReaders() {
     const liveEvents = this.liveTimeline.getEvents();
-    const readers = [];
-
-    for (let i = liveEvents.length - 1; i >= 0; i -= 1) {
-      readers.splice(readers.length, 0, ...this.room.getUsersReadUpTo(liveEvents[i]));
-      if (mEvent === liveEvents[i]) break;
-    }
+    const getLatestVisibleEvent = () => {
+      for (let i = liveEvents.length - 1; i >= 0; i -= 1) {
+        const mEvent = liveEvents[i];
+        if (mEvent.getType() === 'm.room.member' && hideMemberEvents(mEvent)) {
+          // eslint-disable-next-line no-continue
+          continue;
+        }
+        if (!mEvent.isRedacted()
+          && !isReaction(mEvent)
+          && !isEdited(mEvent)
+          && cons.supportEventTypes.includes(mEvent.getType())
+        ) return mEvent;
+      }
+      return liveEvents[liveEvents.length - 1];
+    };
 
-    return [...new Set(readers)];
+    return this.getEventReaders(getLatestVisibleEvent());
   }
 
   getUnreadEventIndex(readUpToEventId) {