Skip to content

Commit 47337ff

Browse files
authored
Merge pull request #712 from GetStream/fix-read-by-issue
fix: handle if last_read is undefined in channel read state
2 parents 37903bd + 3055983 commit 47337ff

File tree

2 files changed

+50
-2
lines changed

2 files changed

+50
-2
lines changed

projects/stream-chat-angular/src/lib/read-by.spec.ts

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,51 @@ describe('getReadBy', () => {
5353
expect(result.find((i) => i.id === 'id3')).toBeDefined();
5454
expect(result.find((i) => i.id === sender.id)).toBeUndefined();
5555
});
56+
57+
it('should handle null last_read values gracefully', () => {
58+
const sender = { id: 'sender', name: 'Tess' };
59+
60+
const message = {
61+
created_at: new Date('2021-09-14T13:08:30.004112Z'),
62+
user: sender,
63+
} as FormatMessageResponse;
64+
65+
const channel = {
66+
state: {
67+
read: {
68+
id1: {
69+
last_read: new Date('2021-09-14T13:08:33.004112Z'),
70+
user: {
71+
id: 'id1',
72+
name: 'John',
73+
},
74+
unread_messages: 2,
75+
},
76+
id2: {
77+
last_read: null,
78+
user: {
79+
id: 'id2',
80+
name: 'Alice',
81+
},
82+
unread_messages: 2,
83+
},
84+
id3: {
85+
last_read: new Date('2021-09-14T13:08:30.004112Z'),
86+
user: {
87+
id: 'id3',
88+
name: 'Bob',
89+
},
90+
unread_messages: 2,
91+
},
92+
},
93+
},
94+
} as unknown as Channel;
95+
96+
const result = getReadBy(message, channel);
97+
98+
expect(result.length).toBe(2);
99+
expect(result.find((i) => i.id === 'id1')).toBeDefined();
100+
expect(result.find((i) => i.id === 'id3')).toBeDefined();
101+
expect(result.find((i) => i.id === 'id2')).toBeUndefined();
102+
});
56103
});

projects/stream-chat-angular/src/lib/read-by.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,10 @@ import { Channel, FormatMessageResponse, UserResponse } from 'stream-chat';
33
export const getReadBy = (message: FormatMessageResponse, channel: Channel) => {
44
const readBy: UserResponse[] = [];
55
Object.keys(channel.state.read).forEach((key) => {
6+
const lastRead = channel.state.read[key].last_read;
67
if (
7-
channel.state.read[key].last_read.getTime() >=
8-
message.created_at.getTime() &&
8+
lastRead &&
9+
lastRead.getTime() >= message.created_at.getTime() &&
910
message.user?.id !== key
1011
) {
1112
readBy.push(channel.state.read[key].user);

0 commit comments

Comments
 (0)