[IMP] mail: introduce Emoji model
Task-2365687 Part-of: odoo/odoo#92485
This commit is contained in:
@@ -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() });
|
||||
}
|
||||
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
}),
|
||||
},
|
||||
});
|
||||
@@ -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: ["</3", "</3"], description: "</3" },
|
||||
{ unicode: "😍", sources: [":heart_eyes"], description: ":heart_eyes" },
|
||||
{ unicode: "👳", sources: [":turban"], description: ":turban" },
|
||||
{ unicode: "👍", sources: [":+1"], description: ":+1" },
|
||||
{ unicode: "👎", sources: [":-1"], description: ":-1" },
|
||||
{ unicode: "👌", sources: [":ok"], description: ":ok" },
|
||||
{ unicode: "💩", sources: [":poop"], description: ":poop" },
|
||||
{ unicode: "🙈", sources: [":no_see"], description: ":no_see" },
|
||||
{ unicode: "🙉", sources: [":no_hear"], description: ":no_hear" },
|
||||
{ unicode: "🙊", sources: [":no_speak"], description: ":no_speak" },
|
||||
{ unicode: "🐞", sources: [":bug"], description: ":bug" },
|
||||
{ unicode: "😺", sources: [":kitten"], description: ":kitten" },
|
||||
{ unicode: "🐻", sources: [":bear"], description: ":bear" },
|
||||
{ unicode: "🐌", sources: [":snail"], description: ":snail" },
|
||||
{ unicode: "🐗", sources: [":boar"], description: ":boar" },
|
||||
{ unicode: "🍀", sources: [":clover"], description: ":clover" },
|
||||
{ unicode: "🌹", sources: [":sunflower"], description: ":sunflower" },
|
||||
{ unicode: "🔥", sources: [":fire"], description: ":fire" },
|
||||
{ unicode: "☀️", sources: [":sun"], description: ":sun" },
|
||||
{ unicode: "⛅️", sources: [":partly_sunny:"], description: ":partly_sunny:" },
|
||||
{ unicode: "🌈", sources: [":rainbow"], description: ":rainbow" },
|
||||
{ unicode: "☁️", sources: [":cloud"], description: ":cloud" },
|
||||
{ unicode: "⚡️", sources: [":zap"], description: ":zap" },
|
||||
{ unicode: "⭐️", sources: [":star"], description: ":star" },
|
||||
{ unicode: "🍪", sources: [":cookie"], description: ":cookie" },
|
||||
{ unicode: "🍕", sources: [":pizza"], description: ":pizza" },
|
||||
{ unicode: "🍔", sources: [":hamburger"], description: ":hamburger" },
|
||||
{ unicode: "🍟", sources: [":fries"], description: ":fries" },
|
||||
{ unicode: "🎂", sources: [":cake"], description: ":cake" },
|
||||
{ unicode: "🍰", sources: [":cake_part"], description: ":cake_part" },
|
||||
{ unicode: "☕️", sources: [":coffee"], description: ":coffee" },
|
||||
{ unicode: "🍌", sources: [":banana"], description: ":banana" },
|
||||
{ unicode: "🍣", sources: [":sushi"], description: ":sushi" },
|
||||
{ unicode: "🍙", sources: [":rice_ball"], description: ":rice_ball" },
|
||||
{ unicode: "🍺", sources: [":beer"], description: ":beer" },
|
||||
{ unicode: "🍷", sources: [":wine"], description: ":wine" },
|
||||
{ unicode: "🍸", sources: [":cocktail"], description: ":cocktail" },
|
||||
{ unicode: "🍹", sources: [":tropical"], description: ":tropical" },
|
||||
{ unicode: "🍻", sources: [":beers"], description: ":beers" },
|
||||
{ unicode: "👻", sources: [":ghost"], description: ":ghost" },
|
||||
{ unicode: "💀", sources: [":skull"], description: ":skull" },
|
||||
{ unicode: "👽", sources: [":et", ":alien"], description: ":et" },
|
||||
{ unicode: "🎉", sources: [":party"], description: ":party" },
|
||||
{ unicode: "🏆", sources: [":trophy"], description: ":trophy" },
|
||||
{ unicode: "🔑", sources: [":key"], description: ":key" },
|
||||
{ unicode: "📌", sources: [":pin"], description: ":pin" },
|
||||
{ unicode: "📯", sources: [":postal_horn"], description: ":postal_horn" },
|
||||
{ unicode: "🎵", sources: [":music"], description: ":music" },
|
||||
{ unicode: "🎺", sources: [":trumpet"], description: ":trumpet" },
|
||||
{ unicode: "🎸", sources: [":guitar"], description: ":guitar" },
|
||||
{ unicode: "🏃", sources: [":run"], description: ":run" },
|
||||
{ unicode: "🚲", sources: [":bike"], description: ":bike" },
|
||||
{ unicode: "⚽️", sources: [":soccer"], description: ":soccer" },
|
||||
{ unicode: "🏈", sources: [":football"], description: ":football" },
|
||||
{ unicode: "🎱", sources: [":8ball"], description: ":8ball" },
|
||||
{ unicode: "🎬", sources: [":clapper"], description: ":clapper" },
|
||||
{ unicode: "🎤", sources: [":microphone"], description: ":microphone" },
|
||||
{ unicode: "🧀", sources: [":cheese"], description: ":cheese" },
|
||||
]),
|
||||
inverse: 'emojiRegistry',
|
||||
}),
|
||||
},
|
||||
});
|
||||
@@ -3,7 +3,6 @@
|
||||
import { registerModel } from '@mail/model/model_core';
|
||||
import { attr, many, one } from '@mail/model/model_field';
|
||||
import { clear, insert, insertAndReplace, replace } from '@mail/model/model_field_command';
|
||||
import emojis from '@mail/js/emojis';
|
||||
import { addLink, htmlToTextContentInline, parseAndTransform } from '@mail/js/utils';
|
||||
|
||||
import { session } from '@web/session';
|
||||
@@ -552,7 +551,7 @@ registerModel({
|
||||
return clear();
|
||||
}
|
||||
let prettyBody;
|
||||
for (const emoji of emojis) {
|
||||
for (const emoji of this.messaging.emojiRegistry.allEmojis) {
|
||||
const { unicode } = emoji;
|
||||
const regexp = new RegExp(
|
||||
`(?:^|\\s|<[a-z]*>)(${unicode})(?=\\s|$|</[a-z]*>)`,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user