diff --git a/addons/im_livechat/static/src/composer/composer_patch.js b/addons/im_livechat/static/src/composer/composer_patch.js index 0ff656d2ff1..5620709b42f 100644 --- a/addons/im_livechat/static/src/composer/composer_patch.js +++ b/addons/im_livechat/static/src/composer/composer_patch.js @@ -30,11 +30,9 @@ patch(Composer.prototype, { return ( this.thread?.type === "livechat" && !this.env.inChatWindow && - Object.values(this.store.discuss.livechat.threads).some((localId) => { - return ( - localId !== this.thread.localId && this.store.Thread.records[localId].isUnread - ); - }) + this.store.discuss.livechat.threads.some( + (thread) => thread.notEq(this.thread) && thread.isUnread + ) ); }, }); diff --git a/addons/im_livechat/static/src/core/@types/models.d.ts b/addons/im_livechat/static/src/core/@types/models.d.ts new file mode 100644 index 00000000000..3a831742636 --- /dev/null +++ b/addons/im_livechat/static/src/core/@types/models.d.ts @@ -0,0 +1,5 @@ +declare module "models" { + export interface DiscussApp { + livechat: DiscussAppCategory, + } +} diff --git a/addons/im_livechat/static/src/core/store_service_patch.js b/addons/im_livechat/static/src/core/discuss_app_model_patch.js similarity index 54% rename from addons/im_livechat/static/src/core/store_service_patch.js rename to addons/im_livechat/static/src/core/discuss_app_model_patch.js index c859043644a..0f7d73b5fff 100644 --- a/addons/im_livechat/static/src/core/store_service_patch.js +++ b/addons/im_livechat/static/src/core/discuss_app_model_patch.js @@ -1,14 +1,15 @@ /* @odoo-module */ -import { Store } from "@mail/core/common/store_service"; +import { DiscussApp } from "@mail/core/common/discuss_app_model"; +import { Record } from "@mail/core/common/record"; import { _t } from "@web/core/l10n/translation"; import { patch } from "@web/core/utils/patch"; -patch(Store.prototype, { - setup(env) { - super.setup(env); - this.discuss.livechat = { +patch(DiscussApp, { + new(data) { + const res = super.new(data); + res.livechat = this.store.DiscussAppCategory.insert({ extraClass: "o-mail-DiscussSidebarCategory-livechat", id: "livechat", name: _t("Livechat"), @@ -16,7 +17,14 @@ patch(Store.prototype, { canView: false, canAdd: false, serverStateKey: "is_discuss_sidebar_category_livechat_open", - threads: [], // list of ids - }; + }); + return res; + }, +}); + +patch(DiscussApp.prototype, { + setup(env) { + super.setup(env); + this.livechat = Record.one("DiscussAppCategory"); }, }); diff --git a/addons/im_livechat/static/src/core/thread_model_patch.js b/addons/im_livechat/static/src/core/thread_model_patch.js index 1a63059c82f..62658754c94 100644 --- a/addons/im_livechat/static/src/core/thread_model_patch.js +++ b/addons/im_livechat/static/src/core/thread_model_patch.js @@ -22,7 +22,7 @@ patch(Thread, { }); } if (isUnknown) { - this.store.discuss.livechat.threads.push(thread.localId); + this.store.discuss.livechat.threads.push(thread); this.env.services["mail.thread"].sortChannels(); } } diff --git a/addons/im_livechat/static/src/core/thread_service_patch.js b/addons/im_livechat/static/src/core/thread_service_patch.js index c03c01ca03a..0f28e463e63 100644 --- a/addons/im_livechat/static/src/core/thread_service_patch.js +++ b/addons/im_livechat/static/src/core/thread_service_patch.js @@ -2,7 +2,6 @@ import { DEFAULT_AVATAR } from "@mail/core/common/persona_service"; import { ThreadService } from "@mail/core/common/thread_service"; -import { removeFromArray } from "@mail/utils/common/arrays"; import { patch } from "@web/core/utils/patch"; @@ -18,12 +17,6 @@ patch(ThreadService.prototype, { this.store.discuss.activeTab = "livechat"; } }, - remove(thread) { - if (thread.type === "livechat") { - removeFromArray(this.store.discuss.livechat.threads, thread.localId); - } - super.remove(thread); - }, canLeave(thread) { return thread.type !== "livechat" && super.canLeave(thread); @@ -46,27 +39,18 @@ patch(ThreadService.prototype, { sortChannels() { super.sortChannels(); // Live chats are sorted by most recent interest date time in the sidebar. - this.store.discuss.livechat.threads.sort((localId_1, localId_2) => { - const thread1 = this.store.Thread.records[localId_1]; - const thread2 = this.store.Thread.records[localId_2]; - return thread2.lastInterestDateTime?.ts - thread1.lastInterestDateTime?.ts; - }); + this.store.discuss.livechat.threads.sort( + (t1, t2) => t2.lastInterestDateTime?.ts - t1.lastInterestDateTime?.ts + ); }, /** * @returns {boolean} Whether the livechat thread changed. */ goToOldestUnreadLivechatThread() { - const oldestUnreadThread = - this.store.Thread.records[ - Object.values(this.store.discuss.livechat.threads) - .filter((localId) => this.store.Thread.records[localId].isUnread) - .sort( - (localId_1, localId_2) => - this.store.Thread.records[localId_1].lastInterestDateTime?.ts - - this.store.Thread.records[localId_2].lastInterestDateTime?.ts - )[0] - ]; + const oldestUnreadThread = this.store.discuss.livechat.threads + .filter((thread) => thread.isUnread) + .sort((t1, t2) => t1.lastInterestDateTime?.ts - t2.lastInterestDateTime?.ts)[0]; if (!oldestUnreadThread) { return false; } diff --git a/addons/im_livechat/static/src/discuss_app/discuss_sidebar_categories_livechat.js b/addons/im_livechat/static/src/discuss_app/discuss_sidebar_categories_livechat.js index 3e36d0dad60..4233cba978f 100644 --- a/addons/im_livechat/static/src/discuss_app/discuss_sidebar_categories_livechat.js +++ b/addons/im_livechat/static/src/discuss_app/discuss_sidebar_categories_livechat.js @@ -5,10 +5,7 @@ import { discussSidebarCategoriesRegistry } from "@mail/discuss/core/web/discuss discussSidebarCategoriesRegistry.add( "livechats", { - predicate: (store) => - store.discuss.livechat.threads.some( - (localId) => store.Thread.records[localId]?.is_pinned - ), + predicate: (store) => store.discuss.livechat.threads.some((thread) => thread?.is_pinned), value: (store) => store.discuss.livechat, }, { sequence: 20 } 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 51ea76cfb02..0d85c69a9b4 100644 --- a/addons/im_livechat/static/src/embed/core/livechat_service.js +++ b/addons/im_livechat/static/src/embed/core/livechat_service.js @@ -157,7 +157,7 @@ export class LivechatService { (c) => c.thread.id === this.TEMPORARY_ID ); if (chatWindow) { - this.env.services["mail.thread"].remove(chatWindow.thread); + chatWindow.thread?.delete(); if (!this.thread) { this.chatWindowService.close(chatWindow); return; 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 18635c620b3..ba73317f735 100644 --- a/addons/mail/static/src/core/common/@types/models.d.ts +++ b/addons/mail/static/src/core/common/@types/models.d.ts @@ -3,6 +3,8 @@ declare module "models" { import { CannedResponse as CannedResponseClass } from "@mail/core/common/canned_response_model"; import { ChannelMember as ChannelMemberClass } from "@mail/core/common/channel_member_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"; import { Follower as FollowerClass } from "@mail/core/common/follower_model"; import { LinkPreview as LinkPreviewClass } from "@mail/core/common/link_preview_model"; import { Message as MessageClass } from "@mail/core/common/message_model"; @@ -16,6 +18,8 @@ declare module "models" { export interface Attachment extends CannedResponseClass {} export interface ChannelMember extends ChannelMemberClass {} export interface Composer extends ComposerClass {} + export interface DiscussApp extends DiscussAppClass {} + export interface DiscussAppCategory extends DiscussAppCategoryClass {} export interface Follower extends FollowerClass {} export interface LinkPreview extends LinkPreviewClass {} export interface Message extends MessageClass {} @@ -30,6 +34,8 @@ declare module "models" { "CannedResponse": CannedResponse, "ChannelMember": ChannelMember, "Composer": Composer, + "DiscussApp": DiscussApp, + "DiscussAppCategory": DiscussAppCategory, "Follower": Follower, "LinkPreview": LinkPreview, "Message": Message, diff --git a/addons/mail/static/src/core/common/discuss.js b/addons/mail/static/src/core/common/discuss.js index 55e0d45bbf4..8170a2a7bba 100644 --- a/addons/mail/static/src/core/common/discuss.js +++ b/addons/mail/static/src/core/common/discuss.js @@ -83,7 +83,7 @@ export class Discuss extends Component { } get thread() { - return this.store.Thread.records[this.store.discuss.threadLocalId]; + return this.store.discuss.thread; } async onFileUploaded(file) { diff --git a/addons/mail/static/src/core/common/discuss.xml b/addons/mail/static/src/core/common/discuss.xml index 8c7d8dc6518..16ad3ecd1a6 100644 --- a/addons/mail/static/src/core/common/discuss.xml +++ b/addons/mail/static/src/core/common/discuss.xml @@ -93,7 +93,7 @@