diff --git a/addons/mail/static/src/core/common/thread_model.js b/addons/mail/static/src/core/common/thread_model.js index dffaf35247f..74e096683ff 100644 --- a/addons/mail/static/src/core/common/thread_model.js +++ b/addons/mail/static/src/core/common/thread_model.js @@ -456,13 +456,25 @@ export class Thread extends Record { return [...this.messages].reverse().find((msg) => Number.isInteger(msg.id)); } - newestPersistentNotEmptyOfAllMessage = Record.one("Message", { + newestPersistentAllMessages = Record.many("Message", { compute() { - const allPersistentMessages = this.allMessages.filter( - (message) => Number.isInteger(message.id) && !message.isEmpty + const allPersistentMessages = this.allMessages.filter((message) => + Number.isInteger(message.id) ); allPersistentMessages.sort((m1, m2) => m2.id - m1.id); - return allPersistentMessages[0]; + return allPersistentMessages; + }, + }); + + newestPersistentOfAllMessage = Record.one("Message", { + compute() { + return this.newestPersistentAllMessages[0]; + }, + }); + + newestPersistentNotEmptyOfAllMessage = Record.one("Message", { + compute() { + return this.newestPersistentAllMessages.find((message) => !message.isEmpty); }, }); diff --git a/addons/mail/static/src/core/common/thread_service.js b/addons/mail/static/src/core/common/thread_service.js index a4d14d713c5..1941b488963 100644 --- a/addons/mail/static/src/core/common/thread_service.js +++ b/addons/mail/static/src/core/common/thread_service.js @@ -100,7 +100,7 @@ export class ThreadService { * @param {import("models").Thread} thread */ markAsRead(thread) { - const newestPersistentMessage = thread.newestPersistentNotEmptyOfAllMessage; + const newestPersistentMessage = thread.newestPersistentOfAllMessage; if (!newestPersistentMessage && !thread.isLoaded) { thread.isLoadedDeferred .then(() => new Promise(setTimeout)) @@ -132,7 +132,7 @@ export class ThreadService { } } - updateSeen(thread, lastSeenId = thread.newestPersistentNotEmptyOfAllMessage?.id) { + updateSeen(thread, lastSeenId = thread.newestPersistentOfAllMessage?.id) { const lastReadIndex = thread.messages.findIndex((message) => message.id === lastSeenId); let newNeedactionCounter = 0; let newUnreadCounter = 0; diff --git a/addons/mail/static/tests/discuss_app/discuss_tests.js b/addons/mail/static/tests/discuss_app/discuss_tests.js index b6c02b5381e..e99ef98cc9b 100644 --- a/addons/mail/static/tests/discuss_app/discuss_tests.js +++ b/addons/mail/static/tests/discuss_app/discuss_tests.js @@ -2056,3 +2056,41 @@ QUnit.test("Newly created chat should be at the top of the direct message list", before: [".o-mail-DiscussSidebar-item", { text: "Albert" }], }); }); + +QUnit.test("Read of unread chat where new message is deleted should mark as read.", async () => { + const pyEnv = await startServer(); + const partnerId = pyEnv["res.partner"].create({ name: "Marc Demo" }); + const channelId = pyEnv["discuss.channel"].create({ + channel_member_ids: [ + Command.create({ partner_id: pyEnv.currentPartnerId }), + Command.create({ partner_id: partnerId }), + ], + channel_type: "chat", + }); + const messageId = pyEnv["mail.message"].create({ + author_id: partnerId, + body: "Heyo", + model: "discuss.channel", + res_id: channelId, + message_type: "comment", + }); + const [memberId] = pyEnv["discuss.channel.member"].search([ + ["channel_id", "=", channelId], + ["partner_id", "=", pyEnv.currentPartnerId], + ]); + pyEnv["discuss.channel.member"].write([memberId], { + seen_message_id: messageId, + message_unread_counter: 1, + }); + const { env, openDiscuss } = await start(); + await openDiscuss(); + await contains("button", { text: "Marc Demo", contains: [".badge", { text: "1" }] }); + // simulate deleted message + await env.services.rpc("/mail/message/update_content", { + message_id: messageId, + body: "", + attachment_ids: [], + }); + await click("button", { text: "Marc Demo" }); + await contains("button", { text: "Marc Demo", contains: [".badge", { count: 0 }] }); +});