diff --git a/app/lib/methods/helpers/markMessagesRead.ts b/app/lib/methods/helpers/markMessagesRead.ts new file mode 100644 index 00000000000..ea79d27a156 --- /dev/null +++ b/app/lib/methods/helpers/markMessagesRead.ts @@ -0,0 +1,31 @@ +import { Q } from '@nozbe/watermelondb'; + +import database from '../../database'; + +interface IMarkMessagesReadParams { + rid: string; + lastOpen: number; +} + +const markMessagesRead = async ({ rid, lastOpen }: IMarkMessagesReadParams) => { + const db = database.active; + try { + const messages = await db + .get('messages') + .query([Q.where('rid', rid), Q.where('unread', true), Q.where('ts', Q.lte(lastOpen))]) + .fetch(); + await db.write(async () => { + await db.batch( + ...messages.map(message => + message.prepareUpdate(m => { + m.unread = false; + }) + ) + ); + }); + } catch (e) { + // do nothing + } +}; + +export default markMessagesRead; diff --git a/app/lib/methods/subscriptions/room.ts b/app/lib/methods/subscriptions/room.ts index 32f1d1f8663..94ce150a6d1 100644 --- a/app/lib/methods/subscriptions/room.ts +++ b/app/lib/methods/subscriptions/room.ts @@ -28,6 +28,7 @@ import sdk from '../../services/sdk'; import { readMessages } from '../readMessages'; import { loadMissedMessages } from '../loadMissedMessages'; import { updateLastOpen } from '../updateLastOpen'; +import markMessagesRead from '../helpers/markMessagesRead'; export default class RoomSubscription { private rid: string; @@ -102,7 +103,7 @@ export default class RoomSubscription { } }; - handleNotifyRoomReceived = protectedFunction((ddpMessage: IDDPMessage) => { + handleNotifyRoomReceived = protectedFunction(async (ddpMessage: IDDPMessage) => { const [_rid, ev] = ddpMessage.fields.eventName.split('/'); if (this.rid !== _rid) { return; @@ -231,6 +232,9 @@ export default class RoomSubscription { log(e); } }); + } else if (ev === 'messagesRead') { + const lastOpen = ddpMessage.fields.args[0]?.until?.$date; + await markMessagesRead({ rid: this.rid, lastOpen }); } }); diff --git a/app/lib/methods/updateMessages.ts b/app/lib/methods/updateMessages.ts index cffcb93c6ef..8d40f52bfd7 100644 --- a/app/lib/methods/updateMessages.ts +++ b/app/lib/methods/updateMessages.ts @@ -147,6 +147,10 @@ export default async function updateMessages({ if (newMessage && !newMessage?.md) { newMessage.md = undefined; } + if (!m?.unread && newMessage?.unread) { + newMessage.unread = false; + m.unread = false; + } Object.assign(m, newMessage); // If image_url didn't change, keep the same attachments, trying to stick to already downloaded media inside att.title_link (starting with file://) diff --git a/app/lib/services/sdk.ts b/app/lib/services/sdk.ts index 4172ecf3c92..0cdda07b231 100644 --- a/app/lib/services/sdk.ts +++ b/app/lib/services/sdk.ts @@ -167,7 +167,8 @@ class Sdk { this.subscribe('stream-room-messages', args[0], ...args), eventUserTyping, this.subscribe(topic, `${args[0]}/deleteMessage`, ...args), - this.subscribe(topic, `${args[0]}/deleteMessageBulk`, ...args) + this.subscribe(topic, `${args[0]}/deleteMessageBulk`, ...args), + this.subscribe(topic, `${args[0]}/messagesRead`, ...args) ]); }