From 29ca8f806a07c69dcdc7855ecee038befff09807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandre=20K=C3=BChn?= Date: Mon, 24 Jul 2023 09:58:57 +0000 Subject: [PATCH] [FIX] mail: chat window state should sync crosstab MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before this commit, chat windows state (open/close/folded) was not syncing between browser tabs. This lack of feature makes using chat in crosstab quite inconvenient. This feature exist in 16.2 and was mistakenly removed from rewritting of Discuss code in 16.3. This commit reimplements as it was in 16.2. Task-3435120 closes odoo/odoo#129812 X-original-commit: 8f27d1f254e79becf6886cdb90a1af14b28e9946 Signed-off-by: Matthieu Stockbauer (tsm) Signed-off-by: Alexandre Kühn (aku) --- .../core/web/discuss_core_web_service.js | 23 +++++++++++++++++++ .../tests/chat_window/chat_window_tests.js | 18 +++++++++++++++ 2 files changed, 41 insertions(+) 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) => {