From d97ffb0ddee073702bc13d8fd88b498be6afcfb3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandre=20K=C3=BChn?= Date: Fri, 22 Sep 2023 16:32:39 +0200 Subject: [PATCH] [REF] mail, *: turn store.discuss into a model This allows to define categories as also models, which allow to register list of threads as relational fields, which in turn simplify code readability and maintainability of these relational data. Part-of: odoo/odoo#136308 --- .../static/src/composer/composer_patch.js | 8 +-- .../static/src/core/@types/models.d.ts | 5 ++ ...ce_patch.js => discuss_app_model_patch.js} | 22 ++++--- .../static/src/core/thread_model_patch.js | 2 +- .../static/src/core/thread_service_patch.js | 28 ++------- .../discuss_sidebar_categories_livechat.js | 5 +- .../static/src/embed/core/livechat_service.js | 2 +- .../static/src/core/common/@types/models.d.ts | 6 ++ addons/mail/static/src/core/common/discuss.js | 2 +- .../mail/static/src/core/common/discuss.xml | 2 +- .../core/common/discuss_app_category_model.js | 41 +++++++++++++ .../src/core/common/discuss_app_model.js | 58 +++++++++++++++++++ addons/mail/static/src/core/common/record.js | 4 ++ .../static/src/core/common/store_service.js | 54 ++++------------- .../static/src/core/common/thread_model.js | 15 ++--- .../static/src/core/common/thread_service.js | 34 ++++------- .../src/core/web/discuss_client_action.js | 6 +- .../core/web/discuss_sidebar_mailboxes.xml | 4 +- .../static/src/core/web/messaging_menu.js | 5 +- .../common/discuss_core_common_service.js | 5 +- .../core/web/discuss_sidebar_categories.js | 3 +- .../core/web/discuss_sidebar_categories.xml | 13 ++--- 22 files changed, 186 insertions(+), 138 deletions(-) create mode 100644 addons/im_livechat/static/src/core/@types/models.d.ts rename addons/im_livechat/static/src/core/{store_service_patch.js => discuss_app_model_patch.js} (54%) create mode 100644 addons/mail/static/src/core/common/discuss_app_category_model.js create mode 100644 addons/mail/static/src/core/common/discuss_app_model.js 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 @@