diff --git a/addons/mail/static/src/components/emoji_list/emoji_list.js b/addons/mail/static/src/components/emoji_list/emoji_list.js index c64c048026f..b5ef2f09d39 100644 --- a/addons/mail/static/src/components/emoji_list/emoji_list.js +++ b/addons/mail/static/src/components/emoji_list/emoji_list.js @@ -1,7 +1,6 @@ /** @odoo-module **/ import { useUpdate } from '@mail/component_hooks/use_update'; -import emojis from '@mail/js/emojis'; import { registerMessagingComponent } from '@mail/utils/messaging_component'; import { LegacyComponent } from '@web/legacy/legacy_component'; @@ -12,7 +11,7 @@ export class EmojiList extends LegacyComponent { */ setup() { super.setup(); - this.emojis = emojis; + this.emojis = this.messaging.emojiRegistry.allEmojis; useUpdate({ func: () => this._update() }); } diff --git a/addons/mail/static/src/models/composer_view.js b/addons/mail/static/src/models/composer_view.js index 6d7897aa422..d6d29ac3e76 100644 --- a/addons/mail/static/src/models/composer_view.js +++ b/addons/mail/static/src/models/composer_view.js @@ -1,6 +1,5 @@ /** @odoo-module **/ -import { emojis } from '@mail/js/emojis'; import { registerModel } from '@mail/model/model_core'; import { attr, many, one } from '@mail/model/model_field'; import { clear, insertAndReplace, link, replace, unlink } from '@mail/model/model_field_command'; @@ -1143,7 +1142,7 @@ registerModel({ * @returns {string} */ _generateEmojisOnHtml(htmlString) { - for (const emoji of emojis) { + for (const emoji of this.messaging.emojiRegistry.allEmojis) { for (const source of emoji.sources) { const escapedSource = String(source).replace( /([.*+?=^!:${}()|[\]/\\])/g, diff --git a/addons/mail/static/src/models/emoji.js b/addons/mail/static/src/models/emoji.js new file mode 100644 index 00000000000..59812f552e9 --- /dev/null +++ b/addons/mail/static/src/models/emoji.js @@ -0,0 +1,30 @@ +/** @odoo-module **/ + +import { registerModel } from '@mail/model/model_core'; +import { attr, one } from '@mail/model/model_field'; +import { insertAndReplace } from '@mail/model/model_field_command'; + +registerModel({ + name: 'Emoji', + identifyingFields: ['unicode'], + fields: { + description: attr({ + readonly: true, + required: true, + }), + emojiRegistry: one('EmojiRegistry', { + default: insertAndReplace(), + inverse: 'allEmojis', + readonly: true, + required: true, + }), + sources: attr({ + readonly: true, + required: true, + }), + unicode: attr({ + readonly: true, + required: true, + }), + }, +}); diff --git a/addons/mail/static/src/models/emoji_registry.js b/addons/mail/static/src/models/emoji_registry.js new file mode 100644 index 00000000000..51d3dc8586e --- /dev/null +++ b/addons/mail/static/src/models/emoji_registry.js @@ -0,0 +1,98 @@ +/** @odoo-module **/ + +import { registerModel } from '@mail/model/model_core'; +import { many } from '@mail/model/model_field'; +import { insertAndReplace } from '@mail/model/model_field_command'; + +registerModel({ + name: 'EmojiRegistry', + identifyingFields: ['messaging'], + fields: { + allEmojis: many('Emoji', { + default: insertAndReplace([ + { unicode: "😊", sources: [":)", ":-)", "=)", ":]"], description: ":)" }, + { unicode: "😃", sources: [":D", ":-D", "=D"], description: ":D" }, + { unicode: "😆", sources: ["xD", "XD"], description: "xD" }, + { unicode: "😂", sources: ["x'D"], description: "x'D" }, + { unicode: "😉", sources: [";)", ";-)"], description: ";)" }, + { unicode: "😎", sources: ["B)", "8)", "B-)", "8-)"], description: "B)" }, + { unicode: "😜", sources: [";p", ";P"], description: ";p" }, + { unicode: "😋", sources: [":p", ":P", ":-p", ":-P", "=P"], description: ":p" }, + { unicode: "😝", sources: ["xp", "xP"], description: "xp" }, + { unicode: "😳", sources: ["o_o"], description: "o_o" }, + { unicode: "😐", sources: [":|", ":-|"], description: ":|" }, + { unicode: "😕", sources: [":/", ":-/"], description: ":/" }, + { unicode: "😞", sources: [":("], description: ":(" }, + { unicode: "😱", sources: [":@"], description: ":@" }, + { unicode: "😲", sources: [":O", ":-O", ":o", ":-o"], description: ":O" }, + { unicode: "😨", sources: [":'o"], description: ":'o" }, + { unicode: "😠", sources: ["3:(", ">:("], description: "3:(" }, + { unicode: "😈", sources: ["3:)", ">:)"], description: "3:)" }, + { unicode: "😘", sources: [":*", ":-*"], description: ":*" }, + { unicode: "😇", sources: ["o:)"], description: "o:)" }, + { unicode: "😢", sources: [":'("], description: ":'(" }, + { unicode: "😭", sources: [":'-(", ":\"("], description: ":'-(" }, + { unicode: "❤️", sources: ["<3", "<3", ":heart"], description: "<3" }, + { unicode: "💔", sources: [")(${unicode})(?=\\s|$|)`, diff --git a/addons/mail/static/src/models/messaging.js b/addons/mail/static/src/models/messaging.js index 64a592f398b..8a645e23402 100644 --- a/addons/mail/static/src/models/messaging.js +++ b/addons/mail/static/src/models/messaging.js @@ -376,6 +376,11 @@ registerModel({ isCausal: true, readonly: true, }), + emojiRegistry: one('EmojiRegistry', { + default: insertAndReplace(), + isCausal: true, + readonly: true, + }), fetchImStatusTimer: one('Timer', { inverse: 'messagingOwnerAsFetchImStatusTimer', isCausal: true,