diff --git a/addons/im_livechat/static/src/embed/common/@types/models.d.ts b/addons/im_livechat/static/src/embed/common/@types/models.d.ts index 2a32d997e96..3bc2cc95e63 100644 --- a/addons/im_livechat/static/src/embed/common/@types/models.d.ts +++ b/addons/im_livechat/static/src/embed/common/@types/models.d.ts @@ -2,5 +2,7 @@ declare module "models" { export interface Thread { chatbotTypingMessage: Message, livechatWelcomeMessage: Message, + chatbotScriptId: number | null, + isNewlyCreated: boolean, } } diff --git a/addons/im_livechat/static/src/embed/common/disabled_features.js b/addons/im_livechat/static/src/embed/common/disabled_features.js index 25b1e7e09a8..166a0517b19 100644 --- a/addons/im_livechat/static/src/embed/common/disabled_features.js +++ b/addons/im_livechat/static/src/embed/common/disabled_features.js @@ -26,7 +26,10 @@ patch(Thread.prototype, { patch(ThreadService.prototype, { async fetchNewMessages(thread) { - if (thread.type !== "livechat" || this.livechatService.state === SESSION_STATE.PERSISTED) { + if ( + thread.type !== "livechat" || + (this.livechatService.state === SESSION_STATE.PERSISTED && !thread.isNewlyCreated) + ) { return super.fetchNewMessages(...arguments); } }, diff --git a/addons/im_livechat/static/src/embed/common/livechat_service.js b/addons/im_livechat/static/src/embed/common/livechat_service.js index 93bca462e42..73e6a212a8c 100644 --- a/addons/im_livechat/static/src/embed/common/livechat_service.js +++ b/addons/im_livechat/static/src/embed/common/livechat_service.js @@ -184,6 +184,7 @@ export class LivechatService { */ async getOrCreateThread({ persist = false } = {}) { let threadData = this.sessionCookie; + let isNewlyCreated = false; if (!threadData || (!threadData.uuid && persist)) { const chatbotScriptId = this.sessionCookie ? this.sessionCookie.chatbot_script_id @@ -199,6 +200,7 @@ export class LivechatService { }, { shadow: true } ); + isNewlyCreated = true; } if (!threadData?.operator_pid) { this.notificationService.add(_t("No available collaborator, please try again later.")); @@ -213,9 +215,10 @@ export class LivechatService { const thread = this.store.Thread.insert({ ...threadData, id: threadData.id ?? this.TEMPORARY_ID, - isLoaded: !threadData.id, + isLoaded: !threadData.id || isNewlyCreated, model: "discuss.channel", type: "livechat", + isNewlyCreated, }); this.state = thread.uuid ? SESSION_STATE.PERSISTED : SESSION_STATE.CREATED; if (this.state === SESSION_STATE.PERSISTED && !this.sessionInitialized) { diff --git a/addons/im_livechat/static/src/embed/common/thread_model_patch.js b/addons/im_livechat/static/src/embed/common/thread_model_patch.js index b8a90ccfead..aaf9a0771d7 100644 --- a/addons/im_livechat/static/src/embed/common/thread_model_patch.js +++ b/addons/im_livechat/static/src/embed/common/thread_model_patch.js @@ -53,12 +53,16 @@ patch(Thread, { }); patch(Thread.prototype, { - chatbotScriptId: null, - setup() { super.setup(); this.chatbotTypingMessage = Record.one("Message"); this.livechatWelcomeMessage = Record.one("Message"); + this.chatbotScriptId = null; + /** + * Indicates whether this thread was just created (i.e. no reload occurs + * since the creation). + */ + this.isNewlyCreated = false; }, get isLastMessageFromCustomer() { diff --git a/addons/im_livechat/static/tests/embed/livechat_service_tests.js b/addons/im_livechat/static/tests/embed/livechat_service_tests.js index c69949a54a9..0ac5260bfe9 100644 --- a/addons/im_livechat/static/tests/embed/livechat_service_tests.js +++ b/addons/im_livechat/static/tests/embed/livechat_service_tests.js @@ -6,8 +6,10 @@ import { loadDefaultConfig, start } from "@im_livechat/../tests/embed/helper/tes import { Command } from "@mail/../tests/helpers/command"; -import { click, contains } from "@web/../tests/utils"; import { cookie } from "@web/core/browser/cookie"; +import { click, contains, insertText } from "@web/../tests/utils"; +import { triggerHotkey } from "@web/../tests/helpers/utils"; +import { Deferred } from "@web/core/utils/concurrency"; QUnit.module("livechat service"); @@ -49,3 +51,38 @@ QUnit.test("previous operator prioritized", async () => { click(".o-livechat-LivechatButton"); await contains(".o-mail-Message-author", { text: "John Doe" }); }); + +QUnit.test("Only necessary requests are made when creating a new chat", async (assert) => { + await startServer(); + await loadDefaultConfig(); + const linkPreviewDeferred = new Deferred(); + await start({ + mockRPC(route) { + if (!route.includes("assets")) { + assert.step(route); + } + if (route === "/mail/link_preview") { + linkPreviewDeferred.resolve(); + } + }, + }); + await contains(".o-livechat-LivechatButton"); + assert.verifySteps([ + "/im_livechat/init", + "/web/webclient/load_menus", // called because menu_service is loaded in qunit bundle + "/mail/load_message_failures", // called because mail/core/web is loaded in qunit bundle + ]); + await click(".o-livechat-LivechatButton"); + assert.verifySteps(["/im_livechat/get_session"]); + await insertText(".o-mail-Composer-input", "Hello!"); + assert.verifySteps([]); + await triggerHotkey("Enter"); + await contains(".o-mail-Message", { text: "Hello!" }); + await linkPreviewDeferred; + assert.verifySteps([ + "/im_livechat/get_session", + "/mail/init_messaging", + "/mail/message/post", + "/mail/link_preview", + ]); +});