diff --git a/addons/mail/static/src/discuss/core/web/discuss_core_web_service.js b/addons/mail/static/src/discuss/core/web/discuss_core_web_service.js index 49ce17950be..db922f4d50b 100644 --- a/addons/mail/static/src/discuss/core/web/discuss_core_web_service.js +++ b/addons/mail/static/src/discuss/core/web/discuss_core_web_service.js @@ -1,5 +1,6 @@ /* @odoo-module */ +import { createLocalId } from "@mail/utils/common/misc"; import { reactive } from "@odoo/owl"; import { _t } from "@web/core/l10n/translation"; @@ -73,6 +74,28 @@ export class DiscussCoreWeb { this.chatWindowService.insert({ thread: chat }); } }); + this.busService.subscribe("mail.record/insert", async (payload) => { + if (payload.Thread) { + const data = payload.Thread; + const thread = this.store.threads[createLocalId(data.model, data.id)]; + if (data.serverFoldState && thread && data.serverFoldState !== thread.state) { + thread.state = data.serverFoldState; + if (thread.state === "closed") { + const chatWindow = this.store.chatWindows.find( + (chatWindow) => chatWindow.threadLocalId === thread.localId + ); + if (chatWindow) { + this.chatWindowService.close(chatWindow); + } + } else { + this.chatWindowService.insert({ + thread, + folded: thread.state === "folded", + }); + } + } + } + }); } } diff --git a/addons/mail/static/tests/chat_window/chat_window_tests.js b/addons/mail/static/tests/chat_window/chat_window_tests.js index 936998bf1d0..ba5160564a2 100644 --- a/addons/mail/static/tests/chat_window/chat_window_tests.js +++ b/addons/mail/static/tests/chat_window/chat_window_tests.js @@ -161,6 +161,24 @@ QUnit.test("chat window: basic rendering", async (assert) => { assert.containsOnce($, "[title='Open in Discuss']"); }); +QUnit.test("Fold state of chat window is sync among browser tabs", async (assert) => { + const pyEnv = await startServer(); + pyEnv["discuss.channel"].create({ name: "General" }); + const tab1 = await start({ asTab: true }); + const tab2 = await start({ asTab: true }); + await tab1.click(".o_menu_systray i[aria-label='Messages']"); + await tab1.click(".o-mail-NotificationItem"); + await tab1.click(".o-mail-ChatWindow-header"); // Fold + assert.containsNone(tab1.target, ".o-mail-ChatWindow .o-mail-ChatWindow-content"); + assert.containsNone(tab2.target, ".o-mail-ChatWindow .o-mail-ChatWindow-content"); + await tab2.click(".o-mail-ChatWindow-header"); // Unfold + assert.containsOnce(tab1.target, ".o-mail-ChatWindow .o-mail-ChatWindow-content"); + assert.containsOnce(tab2.target, ".o-mail-ChatWindow .o-mail-ChatWindow-content"); + await tab1.click("[title='Close Chat Window']"); + assert.containsNone(tab1.target, ".o-mail-ChatWindow"); + assert.containsNone(tab2.target, ".o-mail-ChatWindow"); +}); + QUnit.test( "Mobile: opening a chat window should not update channel state on the server", async (assert) => {