From 98491e3b43e533fe325d9f1cef6ad899e0a86eef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandre=20K=C3=BChn?= Date: Mon, 25 Sep 2023 15:52:06 +0200 Subject: [PATCH] [REF] mail: store all discuss models in Record.records as object MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In preparation to improve insert in relational field with data, so that there's less risk for cyclic code execution (hint: there'll be a preinsert). closes odoo/odoo#136308 Related: odoo/enterprise#47777 Signed-off-by: Sébastien Theys (seb) --- .../src/chat_window/chat_window_patch.js | 13 ++++------ .../embed/chat_window/chat_window_patch.js | 4 ++-- .../src/embed/core/autopopup_service.js | 2 +- .../static/src/embed/core/livechat_service.js | 4 ++-- .../src/embed/core_ui/livechat_button.js | 2 +- .../static/tests/chat_window_patch_tests.js | 13 ++++------ .../static/src/core/common/@types/models.d.ts | 6 +++++ .../static/src/core/common/chat_window.js | 4 ++-- .../src/core/common/chat_window_model.js | 24 ++++++++++++------- .../src/core/common/chat_window_service.js | 23 ++++++++++-------- .../src/core/common/discuss_app_model.js | 2 ++ .../core/common/notification_group_model.js | 13 ++++------ addons/mail/static/src/core/common/record.js | 17 ++++--------- .../static/src/core/common/store_service.js | 3 --- .../static/src/core/common/thread_service.js | 2 +- .../src/core/web/chat_window_service_patch.js | 4 ++-- .../src/core/web/mail_core_web_service.js | 2 +- .../static/src/core/web/messaging_menu.js | 8 +++---- .../static/src/core/web/messaging_menu.xml | 2 +- .../src/core/web/thread_service_patch.js | 10 ++++---- .../core/web/chat_window_service_patch.js | 4 ++-- .../core/web/discuss_core_web_service.js | 4 ++-- 22 files changed, 80 insertions(+), 86 deletions(-) diff --git a/addons/im_livechat/static/src/chat_window/chat_window_patch.js b/addons/im_livechat/static/src/chat_window/chat_window_patch.js index a005d139ee2..1b8cff8186a 100644 --- a/addons/im_livechat/static/src/chat_window/chat_window_patch.js +++ b/addons/im_livechat/static/src/chat_window/chat_window_patch.js @@ -5,14 +5,11 @@ import { ChatWindow } from "@mail/core/common/chat_window"; import { patch } from "@web/core/utils/patch"; patch(ChatWindow.prototype, { - close(options) { - super.close(options); - if ( - this.thread?.type === "livechat" && - this.thread.isLoaded && - this.thread.messages.length === 0 - ) { - this.threadService.unpin(this.thread); + async close(options) { + const thread = this.thread; + await super.close(options); + if (thread?.type === "livechat" && thread.isLoaded && thread.messages.length === 0) { + this.threadService.unpin(thread); } }, }); diff --git a/addons/im_livechat/static/src/embed/chat_window/chat_window_patch.js b/addons/im_livechat/static/src/embed/chat_window/chat_window_patch.js index 7fb261678f9..7c9fa7ff540 100644 --- a/addons/im_livechat/static/src/embed/chat_window/chat_window_patch.js +++ b/addons/im_livechat/static/src/embed/chat_window/chat_window_patch.js @@ -22,7 +22,7 @@ patch(ChatWindow.prototype, { }); }, - close() { + async close() { if (this.thread?.type !== "livechat") { return super.close(); } @@ -31,7 +31,7 @@ patch(ChatWindow.prototype, { this.chatWindowService.show(this.props.chatWindow); } else { this.thread?.delete(); - super.close(); + await super.close(); } this.livechatService.leaveSession(); this.chatbotService.stop(); diff --git a/addons/im_livechat/static/src/embed/core/autopopup_service.js b/addons/im_livechat/static/src/embed/core/autopopup_service.js index 5b1c2b8c134..29bd5f89d51 100644 --- a/addons/im_livechat/static/src/embed/core/autopopup_service.js +++ b/addons/im_livechat/static/src/embed/core/autopopup_service.js @@ -58,7 +58,7 @@ export class AutopopupService { */ async shouldOpenChatWindow() { const thread = await this.livechatService.thread; - return this.storeService.ChatWindow.records.every((cw) => !cw.thread?.eq(thread)); + return this.storeService.discuss.chatWindows.every((cw) => !cw.thread?.eq(thread)); } get allowAutoPopup() { diff --git a/addons/im_livechat/static/src/embed/core/livechat_service.js b/addons/im_livechat/static/src/embed/core/livechat_service.js index 0d85c69a9b4..0742f8af975 100644 --- a/addons/im_livechat/static/src/embed/core/livechat_service.js +++ b/addons/im_livechat/static/src/embed/core/livechat_service.js @@ -153,13 +153,13 @@ export class LivechatService { } finally { this.persistThreadPromise = null; } - const chatWindow = this.store.ChatWindow.records.find( + const chatWindow = this.store.discuss.chatWindows.find( (c) => c.thread.id === this.TEMPORARY_ID ); if (chatWindow) { chatWindow.thread?.delete(); if (!this.thread) { - this.chatWindowService.close(chatWindow); + await this.chatWindowService.close(chatWindow); return; } chatWindow.thread = this.thread; diff --git a/addons/im_livechat/static/src/embed/core_ui/livechat_button.js b/addons/im_livechat/static/src/embed/core_ui/livechat_button.js index bfb7154f50a..888d485388a 100644 --- a/addons/im_livechat/static/src/embed/core_ui/livechat_button.js +++ b/addons/im_livechat/static/src/embed/core_ui/livechat_button.js @@ -68,7 +68,7 @@ export class LivechatButton extends Component { this.livechatService.initialized && this.livechatService.available && !this.livechatService.shouldRestoreSession && - this.store.ChatWindow.records.length === 0 + this.store.discuss.chatWindows.length === 0 ); } } diff --git a/addons/im_livechat/static/tests/chat_window_patch_tests.js b/addons/im_livechat/static/tests/chat_window_patch_tests.js index eb9dee6a411..2f13109a0a7 100644 --- a/addons/im_livechat/static/tests/chat_window_patch_tests.js +++ b/addons/im_livechat/static/tests/chat_window_patch_tests.js @@ -4,7 +4,7 @@ import { startServer } from "@bus/../tests/helpers/mock_python_environment"; import { start } from "@mail/../tests/helpers/test_utils"; -import { click } from "@web/../tests/utils"; +import { click, contains } from "@web/../tests/utils"; QUnit.module("chat window (patch)"); @@ -12,7 +12,7 @@ QUnit.test("closing a chat window with no message from admin side unpins it", as const pyEnv = await startServer(); const partnerId = pyEnv["res.partner"].create({ name: "Demo" }); pyEnv["res.users"].create({ partner_id: partnerId }); - const channelId = pyEnv["discuss.channel"].create({ + pyEnv["discuss.channel"].create({ channel_member_ids: [ [ 0, @@ -27,14 +27,9 @@ QUnit.test("closing a chat window with no message from admin side unpins it", as channel_type: "livechat", uuid: "channel-10-uuid", }); - const { env } = await start(); + await start(); await click(".o_menu_systray i[aria-label='Messages']"); await click(".o-mail-NotificationItem"); await click(".o-mail-ChatWindow-command[title='Close Chat Window']"); - const [channel] = await env.services.rpc( - "/discuss/channel/info", - { channel_id: channelId }, - { silent: true } - ); - assert.strictEqual(channel.is_pinned, false, "Livechat channel should not be pinned"); + await contains(".o_notification", { text: "You unpinned your conversation with Demo" }); }); diff --git a/addons/mail/static/src/core/common/@types/models.d.ts b/addons/mail/static/src/core/common/@types/models.d.ts index ba73317f735..e999fe1c346 100644 --- a/addons/mail/static/src/core/common/@types/models.d.ts +++ b/addons/mail/static/src/core/common/@types/models.d.ts @@ -2,6 +2,7 @@ declare module "models" { import { Attachment as AttachmentClass } from "@mail/core/common/attachment_model"; import { CannedResponse as CannedResponseClass } from "@mail/core/common/canned_response_model"; import { ChannelMember as ChannelMemberClass } from "@mail/core/common/channel_member_model"; + import { ChatWindow as ChatWindowClass } from "@mail/core/common/chat_window_model"; import { Composer as ComposerClass } from "@mail/core/common/composer_model"; import { DiscussApp as DiscussAppClass } from "@mail/core/common/discuss_app_model"; import { DiscussAppCategory as DiscussAppCategoryClass } from "@mail/core/common/discuss_app_category_model"; @@ -10,6 +11,7 @@ declare module "models" { import { Message as MessageClass } from "@mail/core/common/message_model"; import { MessageReactions as MessageReactionsClass } from "@mail/core/common/message_reactions_model"; import { Notification as NotificationClass } from "@mail/core/common/notification_model"; + import { NotificationGroup as NotificationGroupClass } from "@mail/core/common/notification_group_model"; import { Persona as PersonaClass } from "@mail/core/common/persona_model"; import { Thread as ThreadClass } from "@mail/core/common/thread_model"; @@ -17,6 +19,7 @@ declare module "models" { export interface Attachment extends AttachmentClass {} export interface Attachment extends CannedResponseClass {} export interface ChannelMember extends ChannelMemberClass {} + export interface ChatWindow extends ChatWindowClass {} export interface Composer extends ComposerClass {} export interface DiscussApp extends DiscussAppClass {} export interface DiscussAppCategory extends DiscussAppCategoryClass {} @@ -25,6 +28,7 @@ declare module "models" { export interface Message extends MessageClass {} export interface MessageReactions extends MessageReactionsClass {} export interface Notification extends NotificationClass {} + export interface NotificationGroup extends NotificationGroupClass {} export interface Persona extends PersonaClass {} export interface Thread extends ThreadClass {} @@ -33,6 +37,7 @@ declare module "models" { "Attachment": Attachment, "CannedResponse": CannedResponse, "ChannelMember": ChannelMember, + "ChatWindow": ChatWindow, "Composer": Composer, "DiscussApp": DiscussApp, "DiscussAppCategory": DiscussAppCategory, @@ -41,6 +46,7 @@ declare module "models" { "Message": Message, "MessageReactions": MessageReactions, "Notification": Notification, + "NotificationGroup": NotificationGroup, "Persona": Persona, "Thread": Thread, } diff --git a/addons/mail/static/src/core/common/chat_window.js b/addons/mail/static/src/core/common/chat_window.js index f17218aceed..6dd090179ec 100644 --- a/addons/mail/static/src/core/common/chat_window.js +++ b/addons/mail/static/src/core/common/chat_window.js @@ -136,8 +136,8 @@ export class ChatWindow extends Component { } } - close(options) { - this.chatWindowService.close(this.props.chatWindow, options); + async close(options) { + await this.chatWindowService.close(this.props.chatWindow, options); } get actionsMenuTitleText() { diff --git a/addons/mail/static/src/core/common/chat_window_model.js b/addons/mail/static/src/core/common/chat_window_model.js index f06a9233760..f4bd2cb688a 100644 --- a/addons/mail/static/src/core/common/chat_window_model.js +++ b/addons/mail/static/src/core/common/chat_window_model.js @@ -9,8 +9,8 @@ import { _t } from "@web/core/l10n/translation"; export class ChatWindow extends Record { static id = "thread"; - /** @type {import("models").ChatWindow[]} */ - static records = []; + /** @type {Object c.thread?.eq(data.thread)); + const chatWindow = this.store.discuss.chatWindows.find((c) => c.thread?.eq(data.thread)); if (!chatWindow) { const chatWindow = this.new(data); Object.assign(chatWindow, { thread: data.thread }); @@ -33,22 +33,28 @@ export class ChatWindow extends Record { const visible = this.env.services["mail.chat_window"].visible; const maxVisible = this.env.services["mail.chat_window"].maxVisible; if (!data.replaceNewMessageChatWindow) { - if (maxVisible <= this.records.length) { + if (maxVisible <= this.store.discuss.chatWindows.length) { const swaped = visible[visible.length - 1]; index = visible.length - 1; this.env.services["mail.chat_window"].hide(swaped); } else { - index = this.records.length; + index = this.store.discuss.chatWindows.length; } } else { - const newMessageChatWindowIndex = this.records.findIndex((cw) => !cw.thread); + const newMessageChatWindowIndex = this.store.discuss.chatWindows.findIndex( + (cw) => !cw.thread + ); index = newMessageChatWindowIndex !== -1 ? newMessageChatWindowIndex - : this.records.length; + : this.store.discuss.chatWindows.length; } - this.records.splice(index, data.replaceNewMessageChatWindow ? 1 : 0, chatWindow); - return this.records[index]; // return reactive version + this.store.discuss.chatWindows.splice( + index, + data.replaceNewMessageChatWindow ? 1 : 0, + chatWindow + ); + return this.store.discuss.chatWindows[index]; // return reactive version } if (chatWindow.hidden) { this.env.services["mail.chat_window"].makeVisible(chatWindow); diff --git a/addons/mail/static/src/core/common/chat_window_service.js b/addons/mail/static/src/core/common/chat_window_service.js index e3b0162b75c..eb64efbec48 100644 --- a/addons/mail/static/src/core/common/chat_window_service.js +++ b/addons/mail/static/src/core/common/chat_window_service.js @@ -42,7 +42,7 @@ export class ChatWindowService { } openNewMessage() { - if (this.store.ChatWindow.records.some(({ thread }) => !thread)) { + if (this.store.discuss.chatWindows.some(({ thread }) => !thread)) { // New message chat window is already opened. return; } @@ -50,18 +50,18 @@ export class ChatWindowService { } closeNewMessage() { - const newMessageChatWindow = this.store.ChatWindow.records.find(({ thread }) => !thread); + const newMessageChatWindow = this.store.discuss.chatWindows.find(({ thread }) => !thread); if (newMessageChatWindow) { this.close(newMessageChatWindow); } } get visible() { - return this.store.ChatWindow.records.filter((chatWindow) => !chatWindow.hidden); + return this.store.discuss.chatWindows.filter((chatWindow) => !chatWindow.hidden); } get hidden() { - return this.store.ChatWindow.records.filter((chatWindow) => chatWindow.hidden); + return this.store.discuss.chatWindows.filter((chatWindow) => chatWindow.hidden); } get maxVisible() { @@ -109,24 +109,27 @@ export class ChatWindowService { chatWindow.thread.state = "folded"; } - close(chatWindow, { escape = false } = {}) { - if (!chatWindow.hidden && this.maxVisible < this.store.ChatWindow.records.length) { + async close(chatWindow, { escape = false } = {}) { + if (!chatWindow.hidden && this.maxVisible < this.store.discuss.chatWindows.length) { const swaped = this.hidden[0]; swaped.hidden = false; swaped.folded = false; } - const index = this.store.ChatWindow.records.findIndex((c) => c.eq(chatWindow)); + const index = this.store.discuss.chatWindows.findIndex((c) => c.eq(chatWindow)); if (index > -1) { - this.store.ChatWindow.records.splice(index, 1); + this.store.discuss.chatWindows.splice(index, 1); } const thread = chatWindow.thread; if (thread) { thread.state = "closed"; } - if (escape && this.store.ChatWindow.records.length > 0) { - this.focus(this.store.ChatWindow.records[index - 1]); + if (escape && this.store.discuss.chatWindows.length > 0) { + this.focus(this.store.discuss.chatWindows[index - 1]); } + await this._onClose(chatWindow); + chatWindow.delete(); } + async _onClose(chatWindow) {} } export const chatWindowService = { diff --git a/addons/mail/static/src/core/common/discuss_app_model.js b/addons/mail/static/src/core/common/discuss_app_model.js index 577ef7c32c1..c24d0e3f348 100644 --- a/addons/mail/static/src/core/common/discuss_app_model.js +++ b/addons/mail/static/src/core/common/discuss_app_model.js @@ -45,6 +45,8 @@ export class DiscussApp extends Record { /** @type {'mailbox'|'all'|'channel'|'chat'|'livechat'} */ activeTab = "all"; + chatWindows = Record.many("ChatWindow"); + notificationGroups = Record.many("NotificationGroup"); isActive = false; thread = Record.one("Thread"); channels = Record.one("DiscussAppCategory"); diff --git a/addons/mail/static/src/core/common/notification_group_model.js b/addons/mail/static/src/core/common/notification_group_model.js index 740466d250d..606532aec36 100644 --- a/addons/mail/static/src/core/common/notification_group_model.js +++ b/addons/mail/static/src/core/common/notification_group_model.js @@ -1,15 +1,14 @@ /* @odoo-module */ import { Record } from "@mail/core/common/record"; -import { removeFromArrayWithPredicate } from "@mail/utils/common/arrays"; import { _t } from "@web/core/l10n/translation"; let nextId = 1; export class NotificationGroup extends Record { static id = "id"; - /** @type {import("models").NotificationGroup[]} */ - static records = []; + /** @type {Object.} */ + static records = {}; /** @returns {import("models").NotificationGroup} */ static new(data) { return super.new(data); @@ -23,7 +22,7 @@ export class NotificationGroup extends Record { * @returns {import("models").NotificationGroup} */ static insert(data) { - let group = this.records.find((group) => { + let group = this.store.discuss.notificationGroups.find((group) => { return ( group.resModel === data.resModel && group.type === data.type && @@ -34,13 +33,11 @@ export class NotificationGroup extends Record { const id = nextId++; group = this.new({ id }); Object.assign(group, { id }); - this.store.NotificationGroup.records.push(group); - // return reactive - group = this.store.NotificationGroup.records.find((g) => g.eq(group)); + this.store.discuss.notificationGroups.add(group); } group.update(data); if (group.notifications.length === 0) { - removeFromArrayWithPredicate(this.records, (gr) => gr.eq(group)); + group.delete(); } return group; } diff --git a/addons/mail/static/src/core/common/record.js b/addons/mail/static/src/core/common/record.js index b466c251b06..d764d970b94 100644 --- a/addons/mail/static/src/core/common/record.js +++ b/addons/mail/static/src/core/common/record.js @@ -342,11 +342,9 @@ export class Record { const obj = new this.Class(); let record = Object.assign(obj, { localId: this.localId(data), Model: this }); Object.assign(record, { _store: this.store }); - if (!Array.isArray(this.records)) { - this.records[record.localId] = record; - // return reactive version - record = this.records[record.localId]; - } + this.records[record.localId] = record; + // return reactive version + record = this.records[record.localId]; return record; } /** @@ -435,14 +433,7 @@ export class Record { } } if (this.Model) { - if (Array.isArray(this.Model.records)) { - const index = this.Model.records.findIndex((r) => r.eq(r1)); - if (index !== -1) { - this.Model.records.splice(index, 1); - } - } else { - delete this.Model.records[r1.localId]; - } + delete this.Model.records[r1.localId]; delete this.Model; } } diff --git a/addons/mail/static/src/core/common/store_service.js b/addons/mail/static/src/core/common/store_service.js index 0af7581f3fc..e6be598141e 100644 --- a/addons/mail/static/src/core/common/store_service.js +++ b/addons/mail/static/src/core/common/store_service.js @@ -53,9 +53,6 @@ export class Store { return undefined; } const modelName = Record.modelFromLocalId(localId); - if (Array.isArray(this[modelName].records)) { - return this[modelName].records.find((r) => r.localId === localId); - } return this[modelName].records[localId]; } diff --git a/addons/mail/static/src/core/common/thread_service.js b/addons/mail/static/src/core/common/thread_service.js index 6d5a9b1116b..30d3a203805 100644 --- a/addons/mail/static/src/core/common/thread_service.js +++ b/addons/mail/static/src/core/common/thread_service.js @@ -411,7 +411,7 @@ export class ThreadService { thread.pendingNewMessages = []; } - unpin(thread) { + async unpin(thread) { if (thread.eq(this.store.discuss.thread)) { this.router.replaceState({ active_id: undefined }); } diff --git a/addons/mail/static/src/core/web/chat_window_service_patch.js b/addons/mail/static/src/core/web/chat_window_service_patch.js index 6d737a24ea8..67d03688a67 100644 --- a/addons/mail/static/src/core/web/chat_window_service_patch.js +++ b/addons/mail/static/src/core/web/chat_window_service_patch.js @@ -5,7 +5,7 @@ import { ChatWindowService } from "@mail/core/common/chat_window_service"; import { patch } from "@web/core/utils/patch"; patch(ChatWindowService.prototype, { - async close() { + async _onClose(chatWindow) { if (this.ui.isSmall && !this.store.discuss.isActive) { // If we are in mobile and discuss is not open, it means the // chat window was opened from the messaging menu. In that @@ -15,6 +15,6 @@ patch(ChatWindowService.prototype, { // ensure messaging menu is opened before chat window is closed await Promise.resolve(); } - await super.close(...arguments); + await super._onClose(...arguments); }, }); diff --git a/addons/mail/static/src/core/web/mail_core_web_service.js b/addons/mail/static/src/core/web/mail_core_web_service.js index 1bbf7d2d58c..62d93c329ca 100644 --- a/addons/mail/static/src/core/web/mail_core_web_service.js +++ b/addons/mail/static/src/core/web/mail_core_web_service.js @@ -33,7 +33,7 @@ export class MailCoreWeb { author: this.store.user, }) ); - this.store.NotificationGroup.records.sort( + this.store.discuss.notificationGroups.sort( (n1, n2) => n2.lastMessage?.id - n1.lastMessage?.id ); }); diff --git a/addons/mail/static/src/core/web/messaging_menu.js b/addons/mail/static/src/core/web/messaging_menu.js index 759f019e220..91dbffce345 100644 --- a/addons/mail/static/src/core/web/messaging_menu.js +++ b/addons/mail/static/src/core/web/messaging_menu.js @@ -74,7 +74,7 @@ export class MessagingMenu extends Component { get hasPreviews() { return ( this.threads.length > 0 || - (this.store.NotificationGroup.records.length > 0 && + (this.store.discuss.notificationGroups.length > 0 && this.store.discuss.activeTab === "all") || (this.notification.permission === "prompt" && this.store.discuss.activeTab === "all") ); @@ -86,7 +86,7 @@ export class MessagingMenu extends Component { displayName: _t("%s has a request", this.store.odoobot.name), iconSrc: this.threadService.avatarUrl(this.store.odoobot), partner: this.store.odoobot, - isLast: this.threads.length === 0 && this.store.NotificationGroup.records.length === 0, + isLast: this.threads.length === 0 && this.store.discuss.notificationGroups.length === 0, isShown: this.store.discuss.activeTab === "all" && this.notification.permission === "prompt", }; @@ -234,7 +234,7 @@ export class MessagingMenu extends Component { }); // Close the related chat window as having both the form view // and the chat window does not look good. - this.store.ChatWindow.records.find(({ thr }) => thr?.eq(thread))?.close(); + this.store.discuss.chatWindows.find(({ thr }) => thr?.eq(thread))?.close(); } else { this.threadService.open(thread); } @@ -297,7 +297,7 @@ export class MessagingMenu extends Component { Object.values(this.store.Thread.records).filter( (thread) => thread.is_pinned && thread.message_unread_counter > 0 ).length + - Object.values(this.store.NotificationGroup.records).reduce( + this.store.discuss.notificationGroups.reduce( (acc, ng) => acc + parseInt(ng.notifications.length), 0 ); diff --git a/addons/mail/static/src/core/web/messaging_menu.xml b/addons/mail/static/src/core/web/messaging_menu.xml index 7782e7248d0..40816c97576 100644 --- a/addons/mail/static/src/core/web/messaging_menu.xml +++ b/addons/mail/static/src/core/web/messaging_menu.xml @@ -15,7 +15,7 @@ - +
diff --git a/addons/mail/static/src/core/web/thread_service_patch.js b/addons/mail/static/src/core/web/thread_service_patch.js index 920286cf153..887bfb31f96 100644 --- a/addons/mail/static/src/core/web/thread_service_patch.js +++ b/addons/mail/static/src/core/web/thread_service_patch.js @@ -168,9 +168,9 @@ patch(ThreadService.prototype, { thread.suggestedRecipients = recipients; }, async leaveChannel(channel) { - const chatWindow = this.store.ChatWindow.records.find((c) => c.thread?.eq(channel)); + const chatWindow = this.store.discuss.chatWindows.find((c) => c.thread?.eq(channel)); if (chatWindow) { - this.chatWindowService.close(chatWindow); + await this.chatWindowService.close(chatWindow); } super.leaveChannel(...arguments); }, @@ -239,10 +239,10 @@ patch(ThreadService.prototype, { ]); follower.delete(); }, - unpin(thread) { - const chatWindow = this.store.ChatWindow.records.find((c) => c.thread?.eq(thread)); + async unpin(thread) { + const chatWindow = this.store.discuss.chatWindows.find((c) => c.thread?.eq(thread)); if (chatWindow) { - this.chatWindowService.close(chatWindow); + await this.chatWindowService.close(chatWindow); } super.unpin(...arguments); }, diff --git a/addons/mail/static/src/discuss/core/web/chat_window_service_patch.js b/addons/mail/static/src/discuss/core/web/chat_window_service_patch.js index 2b3d8760917..2017a8173ca 100644 --- a/addons/mail/static/src/discuss/core/web/chat_window_service_patch.js +++ b/addons/mail/static/src/discuss/core/web/chat_window_service_patch.js @@ -5,8 +5,8 @@ import { ChatWindowService } from "@mail/core/common/chat_window_service"; import { patch } from "@web/core/utils/patch"; patch(ChatWindowService.prototype, { - close(chatWindow) { - super.close(...arguments); + async _onClose(chatWindow) { + await super._onClose(...arguments); this.notifyState(chatWindow); }, hide(chatWindow) { 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 53d09bc885b..f1ca5801cad 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 @@ -90,11 +90,11 @@ export class DiscussCoreWeb { if (data.serverFoldState && thread && data.serverFoldState !== thread.state) { thread.state = data.serverFoldState; if (thread.state === "closed") { - const chatWindow = this.store.ChatWindow.records.find((chatWindow) => + const chatWindow = this.store.discuss.chatWindows.find((chatWindow) => chatWindow.thread?.eq(thread) ); if (chatWindow) { - this.chatWindowService.close(chatWindow); + await this.chatWindowService.close(chatWindow); } } else { this.store.ChatWindow.insert({