Skip to content

Commit 2a4b4fb

Browse files
fix: read receipts are not being marked as read (#6610)
* fix: last message * fix: message unread * chore: remove logs * feat: update just message as read instead of use LoadMissedMessages
1 parent bffff13 commit 2a4b4fb

File tree

4 files changed

+42
-2
lines changed

4 files changed

+42
-2
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { Q } from '@nozbe/watermelondb';
2+
3+
import database from '../../database';
4+
5+
interface IMarkMessagesReadParams {
6+
rid: string;
7+
lastOpen: number;
8+
}
9+
10+
const markMessagesRead = async ({ rid, lastOpen }: IMarkMessagesReadParams) => {
11+
const db = database.active;
12+
try {
13+
const messages = await db
14+
.get('messages')
15+
.query([Q.where('rid', rid), Q.where('unread', true), Q.where('ts', Q.lte(lastOpen))])
16+
.fetch();
17+
await db.write(async () => {
18+
await db.batch(
19+
...messages.map(message =>
20+
message.prepareUpdate(m => {
21+
m.unread = false;
22+
})
23+
)
24+
);
25+
});
26+
} catch (e) {
27+
// do nothing
28+
}
29+
};
30+
31+
export default markMessagesRead;

app/lib/methods/subscriptions/room.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import sdk from '../../services/sdk';
2828
import { readMessages } from '../readMessages';
2929
import { loadMissedMessages } from '../loadMissedMessages';
3030
import { updateLastOpen } from '../updateLastOpen';
31+
import markMessagesRead from '../helpers/markMessagesRead';
3132

3233
export default class RoomSubscription {
3334
private rid: string;
@@ -102,7 +103,7 @@ export default class RoomSubscription {
102103
}
103104
};
104105

105-
handleNotifyRoomReceived = protectedFunction((ddpMessage: IDDPMessage) => {
106+
handleNotifyRoomReceived = protectedFunction(async (ddpMessage: IDDPMessage) => {
106107
const [_rid, ev] = ddpMessage.fields.eventName.split('/');
107108
if (this.rid !== _rid) {
108109
return;
@@ -231,6 +232,9 @@ export default class RoomSubscription {
231232
log(e);
232233
}
233234
});
235+
} else if (ev === 'messagesRead') {
236+
const lastOpen = ddpMessage.fields.args[0]?.until?.$date;
237+
await markMessagesRead({ rid: this.rid, lastOpen });
234238
}
235239
});
236240

app/lib/methods/updateMessages.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,10 @@ export default async function updateMessages({
147147
if (newMessage && !newMessage?.md) {
148148
newMessage.md = undefined;
149149
}
150+
if (!m?.unread && newMessage?.unread) {
151+
newMessage.unread = false;
152+
m.unread = false;
153+
}
150154
Object.assign(m, newMessage);
151155

152156
// If image_url didn't change, keep the same attachments, trying to stick to already downloaded media inside att.title_link (starting with file://)

app/lib/services/sdk.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,8 @@ class Sdk {
167167
this.subscribe('stream-room-messages', args[0], ...args),
168168
eventUserTyping,
169169
this.subscribe(topic, `${args[0]}/deleteMessage`, ...args),
170-
this.subscribe(topic, `${args[0]}/deleteMessageBulk`, ...args)
170+
this.subscribe(topic, `${args[0]}/deleteMessageBulk`, ...args),
171+
this.subscribe(topic, `${args[0]}/messagesRead`, ...args)
171172
]);
172173
}
173174

0 commit comments

Comments
 (0)