From 7fcf33189e5a4ef786c535b253b80a87853ca57b Mon Sep 17 00:00:00 2001 From: tsm-odoo Date: Mon, 7 Aug 2023 09:27:39 +0000 Subject: [PATCH] [FIX] im_livechat: fix livechat session state MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before this commit, the fold state, seen message id and message unread counter was never saved on the livechat session state. This is due to an incorrect check on the session state. We wan't to ensure the session is not closed when writing such information but the state was checked on the thread instead of the livechat service. closes odoo/odoo#131049 X-original-commit: a81208d980a2a30bcff6382729e2ed8369e6a65d Signed-off-by: Sébastien Theys (seb) Signed-off-by: Matthieu Stockbauer (tsm) --- .../src/embed/core/thread_service_patch.js | 12 ++++++--- .../tests/embed/livechat_session_tests.js | 26 +++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/addons/im_livechat/static/src/embed/core/thread_service_patch.js b/addons/im_livechat/static/src/embed/core/thread_service_patch.js index 89a6c12533b..d5cd6b9c6d1 100644 --- a/addons/im_livechat/static/src/embed/core/thread_service_patch.js +++ b/addons/im_livechat/static/src/embed/core/thread_service_patch.js @@ -133,17 +133,23 @@ patch(ThreadService.prototype, { }); } onChange(thread, "state", () => { - if ([SESSION_STATE.CLOSED, SESSION_STATE.NONE].includes(thread.state)) { + if ( + ![SESSION_STATE.CLOSED, SESSION_STATE.NONE].includes(this.livechatService.state) + ) { this.livechatService.updateSession({ state: thread.state }); } }); onChange(thread, "seen_message_id", () => { - if ([SESSION_STATE.CLOSED, SESSION_STATE.NONE].includes(thread.state)) { + if ( + ![SESSION_STATE.CLOSED, SESSION_STATE.NONE].includes(this.livechatService.state) + ) { this.livechatService.updateSession({ seen_message_id: thread.seen_message_id }); } }); onChange(thread, "message_unread_counter", () => { - if ([SESSION_STATE.CLOSED, SESSION_STATE.NONE].includes(thread.state)) { + if ( + ![SESSION_STATE.CLOSED, SESSION_STATE.NONE].includes(this.livechatService.state) + ) { this.livechatService.updateSession({ channel: thread.channel }); } }); diff --git a/addons/im_livechat/static/tests/embed/livechat_session_tests.js b/addons/im_livechat/static/tests/embed/livechat_session_tests.js index 17ec20404d7..e0cf44555cc 100644 --- a/addons/im_livechat/static/tests/embed/livechat_session_tests.js +++ b/addons/im_livechat/static/tests/embed/livechat_session_tests.js @@ -62,3 +62,29 @@ QUnit.test("Session is reset after failing to persist the channel", async (asser await click(".o-livechat-LivechatButton"); assert.containsOnce($, ".o-mail-ChatWindow"); }); + +QUnit.test("Thread state is saved on the session", async (assert) => { + await startServer(); + await loadDefaultConfig(); + const env = await start(); + await click(".o-livechat-LivechatButton"); + assert.strictEqual(env.services["im_livechat.livechat"].sessionCookie.state, "open"); + await click(".o-mail-ChatWindow-header"); + assert.strictEqual(env.services["im_livechat.livechat"].sessionCookie.state, "folded"); + await click(".o-mail-ChatWindow-header"); + assert.strictEqual(env.services["im_livechat.livechat"].sessionCookie.state, "open"); +}); + +QUnit.test("Seen message is saved on the session", async (assert) => { + await startServer(); + await loadDefaultConfig(); + const env = await start(); + await click(".o-livechat-LivechatButton"); + assert.notOk(env.services["im_livechat.livechat"].sessionCookie.seen_message_id); + await insertText(".o-mail-Composer-input", "Hello World!"); + await afterNextRender(() => triggerHotkey("Enter")); + assert.strictEqual( + env.services["im_livechat.livechat"].sessionCookie.seen_message_id, + env.services["im_livechat.livechat"].thread.seenInfos[0].lastSeenMessage.id + ); +});