[IMP] mail: introduce Emoji model

Task-2365687

Part-of: odoo/odoo#92485
This commit is contained in:
Nemael
2022-06-02 18:58:36 +02:00
parent 299138350d
commit 03dc1bed08
6 changed files with 136 additions and 6 deletions
@@ -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,
+30
View File
@@ -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", "&lt;3", ":heart"], description: "<3" },
{ unicode: "💔", sources: ["</3", "&lt;/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',
}),
},
});
+1 -2
View File
@@ -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,