Skip to content

Commit 3ecd31e

Browse files
committed
fix: exclude own read state from delivery status inference in ChannelPreview
1 parent cf3ad0f commit 3ecd31e

File tree

2 files changed

+63
-5
lines changed

2 files changed

+63
-5
lines changed

src/components/ChannelPreview/hooks/__tests__/useMessageDeliveryStatus.test.js

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {
2121
import { act } from '@testing-library/react';
2222
import { dispatchMessageDeliveredEvent } from '../../../../mock-builders/event/messageDelivered';
2323

24-
const userA = generateUser();
24+
const userA = generateUser({ id: 'own-user' });
2525
const userB = generateUser();
2626
const getClientAndChannel = async (channelData = {}, user = userA) => {
2727
const members = [generateMember({ user: userA }), generateMember({ user: userB })];
@@ -79,6 +79,42 @@ const lastMessageCreated = (messages) => [
7979
},
8080
];
8181

82+
const lastDeliveredOnlyToMe = (messages) => [
83+
{
84+
last_delivered_at: messages[1].created_at.toISOString(),
85+
last_delivered_message_id: messages[1].id,
86+
last_read: messages[0].created_at.toISOString(),
87+
last_read_message_id: messages[0],
88+
unread_messages: 0,
89+
user: userA,
90+
},
91+
{
92+
last_delivered_at: messages[0].created_at.toISOString(),
93+
last_delivered_message_id: messages[0].id,
94+
last_read: messages[0].created_at.toISOString(),
95+
unread_messages: 1,
96+
user: userB,
97+
},
98+
];
99+
100+
const lastReadOnlyByMe = (messages) => [
101+
{
102+
last_delivered_at: messages[1].created_at.toISOString(),
103+
last_delivered_message_id: messages[1].id,
104+
last_read: messages[1].created_at.toISOString(),
105+
last_read_message_id: messages[1],
106+
unread_messages: 0,
107+
user: userA,
108+
},
109+
{
110+
last_delivered_at: messages[0].created_at.toISOString(),
111+
last_delivered_message_id: messages[0].id,
112+
last_read: messages[0].created_at.toISOString(),
113+
unread_messages: 1,
114+
user: userB,
115+
},
116+
];
117+
82118
const lastMessageDelivered = (messages) => [
83119
{
84120
last_delivered_at: messages[0].created_at.toISOString(),
@@ -162,14 +198,30 @@ describe('Message delivery status', () => {
162198
expect(result.current.messageDeliveryStatus).toBeUndefined();
163199
});
164200

165-
it('is "created" if the last message was not delivered neither read by any other member', async () => {
201+
it('is "sent" if the last message was not delivered neither read by any other member', async () => {
166202
const { lastMessage, messages } = ownLastMessage();
167203
const read = lastMessageCreated(messages);
168204
const { channel, client } = await getClientAndChannel({ messages, read });
169205
const { result } = renderComponent({ channel, client, lastMessage });
170206
expect(result.current.messageDeliveryStatus).toBe(MessageDeliveryStatus.SENT);
171207
});
172208

209+
it('is "sent" if the last message was delivered only to own user', async () => {
210+
const { lastMessage, messages } = ownLastMessage();
211+
const read = lastDeliveredOnlyToMe(messages);
212+
const { channel, client } = await getClientAndChannel({ messages, read });
213+
const { result } = renderComponent({ channel, client, lastMessage });
214+
expect(result.current.messageDeliveryStatus).toBe(MessageDeliveryStatus.SENT);
215+
});
216+
217+
it('is "sent" if the last message was read only by own user', async () => {
218+
const { lastMessage, messages } = ownLastMessage();
219+
const read = lastReadOnlyByMe(messages);
220+
const { channel, client } = await getClientAndChannel({ messages, read });
221+
const { result } = renderComponent({ channel, client, lastMessage });
222+
expect(result.current.messageDeliveryStatus).toBe(MessageDeliveryStatus.SENT);
223+
});
224+
173225
it('is "delivered" if the last message in channel was delivered but not read by any member other than me', async () => {
174226
const { lastMessage, messages } = ownLastMessage();
175227
const read = lastMessageDelivered(messages);

src/components/ChannelPreview/hooks/useMessageDeliveryStatus.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,20 @@ export const useMessageDeliveryStatus = ({
4343
msgId: lastMessage.id,
4444
timestampMs: lastMessage.created_at.getTime(),
4545
};
46+
const readersForMessage = channel.messageReceiptsTracker.readersForMessage(msgRef);
47+
const deliveredForMessage =
48+
channel.messageReceiptsTracker.deliveredForMessage(msgRef);
4649
setMessageDeliveryStatus(
47-
channel.messageReceiptsTracker.readersForMessage(msgRef).length > 0
50+
readersForMessage.length > 1 ||
51+
(readersForMessage.length === 1 && readersForMessage[0].id !== client.user?.id)
4852
? MessageDeliveryStatus.READ
49-
: channel.messageReceiptsTracker.deliveredForMessage(msgRef).length > 0
53+
: deliveredForMessage.length > 1 ||
54+
(deliveredForMessage.length === 1 &&
55+
deliveredForMessage[0].id !== client.user?.id)
5056
? MessageDeliveryStatus.DELIVERED
5157
: MessageDeliveryStatus.SENT,
5258
);
53-
}, [channel, isOwnMessage, lastMessage]);
59+
}, [channel, client, isOwnMessage, lastMessage]);
5460

5561
useEffect(() => {
5662
const handleMessageNew = (event: Event) => {

0 commit comments

Comments
 (0)