From b9f452fc2eb6a54f3fb16fe614a3e269f81b4210 Mon Sep 17 00:00:00 2001 From: Thanos30 Date: Fri, 1 Sep 2023 17:41:32 +0300 Subject: [PATCH 1/4] Emoji Suggestions Adjustments + Remove Duplicates --- src/libs/EmojiTrie.js | 43 ++++++++++++++++++++++++++++-------------- src/libs/EmojiUtils.js | 9 ++++++++- 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/libs/EmojiTrie.js b/src/libs/EmojiTrie.js index c5448c340d81..3bebbf750628 100644 --- a/src/libs/EmojiTrie.js +++ b/src/libs/EmojiTrie.js @@ -18,26 +18,40 @@ function createTrie(lang = CONST.LOCALES.DEFAULT) { return; } - const name = isDefaultLocale ? item.name : _.get(langEmojis, [item.code, 'name']); - const names = isDefaultLocale ? [name] : [...new Set([name, item.name])]; - _.forEach(names, (nm) => { - const node = trie.search(nm); - if (!node) { - trie.add(nm, {code: item.code, types: item.types, name: nm, suggestions: []}); - } else { - trie.update(nm, {code: item.code, types: item.types, name: nm, suggestions: node.metaData.suggestions}); - } - }); - - const keywords = _.get(langEmojis, [item.code, 'keywords'], []).concat(isDefaultLocale ? [] : _.get(localeEmojis, [CONST.LOCALES.DEFAULT, item.code, 'keywords'], [])); + const defaultName = item.name; + const preferredLanguageName = _.get(langEmojis, [item.code, 'name'], defaultName); + + // Add the actual name of the emoji for the current language + const node = trie.search(preferredLanguageName); + if (!node) { + trie.add(preferredLanguageName, {code: item.code, types: item.types, name: preferredLanguageName, suggestions: []}); + } else { + trie.update(preferredLanguageName, {code: item.code, types: item.types, name: preferredLanguageName, suggestions: node.metaData.suggestions}); + } + + // Add keywords of both the current language and the default language, in case current language isn't the default. + const keywords = _.get(langEmojis, [item.code, 'keywords'], []).concat(isDefaultLocale ? [] : _.get(localeEmojis, [CONST.LOCALES.DEFAULT, item.code, 'keywords'], []));; for (let j = 0; j < keywords.length; j++) { const keywordNode = trie.search(keywords[j]); if (!keywordNode) { - trie.add(keywords[j], {suggestions: [{code: item.code, types: item.types, name}]}); + trie.add(keywords[j], {suggestions: [{code: item.code, types: item.types, name: preferredLanguageName}]}); } else { trie.update(keywords[j], { ...keywordNode.metaData, - suggestions: [...keywordNode.metaData.suggestions, {code: item.code, types: item.types, name}], + suggestions: [...keywordNode.metaData.suggestions, {code: item.code, types: item.types, name: preferredLanguageName}], + }); + } + } + + // If current language isn't the default, prepend the English name of the emoji in the suggestions as well. + if (!isDefaultLocale) { + const englishNode = trie.search(defaultName); + if (!englishNode) { + trie.add(defaultName, {suggestions: [{code: item.code, types: item.types, name: preferredLanguageName}]}); + } else { + trie.update(defaultName, { + ...englishNode.metaData, + suggestions: [{code: item.code, types: item.types, name: preferredLanguageName}, ...englishNode.metaData.suggestions], }); } } @@ -46,6 +60,7 @@ function createTrie(lang = CONST.LOCALES.DEFAULT) { return trie; } + const emojiTrie = _.reduce(supportedLanguages, (prev, cur) => ({...prev, [cur]: createTrie(cur)}), {}); Timing.end(CONST.TIMING.TRIE_INITIALIZATION); diff --git a/src/libs/EmojiUtils.js b/src/libs/EmojiUtils.js index df00418b7524..c8133023d80e 100644 --- a/src/libs/EmojiUtils.js +++ b/src/libs/EmojiUtils.js @@ -319,7 +319,14 @@ function replaceEmojis(text, preferredSkinTone = CONST.EMOJI_DEFAULT_SKIN_TONE, } for (let i = 0; i < emojiData.length; i++) { const name = emojiData[i].slice(1, -1); - const checkEmoji = trie.search(name); + let checkEmoji = trie.search(name); + if ((!checkEmoji || !checkEmoji.metaData.code) && lang !== CONST.LOCALES.DEFAULT) { + const englishTrie = emojisTrie[CONST.LOCALES.DEFAULT]; + if (englishTrie) { + const englishEmoji = englishTrie.search(name); + checkEmoji = englishEmoji; + } + } if (checkEmoji && checkEmoji.metaData.code) { let emojiReplacement = getEmojiCodeWithSkinColor(checkEmoji.metaData, preferredSkinTone); emojis.push({ From 5f744b7c293e3dcb0e022de61b5dcd04a6b9c8be Mon Sep 17 00:00:00 2001 From: Thanos30 Date: Fri, 1 Sep 2023 21:05:13 +0300 Subject: [PATCH 2/4] npm run prettier --- src/libs/EmojiTrie.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/libs/EmojiTrie.js b/src/libs/EmojiTrie.js index 3bebbf750628..7f396e5188af 100644 --- a/src/libs/EmojiTrie.js +++ b/src/libs/EmojiTrie.js @@ -20,7 +20,7 @@ function createTrie(lang = CONST.LOCALES.DEFAULT) { const defaultName = item.name; const preferredLanguageName = _.get(langEmojis, [item.code, 'name'], defaultName); - + // Add the actual name of the emoji for the current language const node = trie.search(preferredLanguageName); if (!node) { @@ -28,9 +28,9 @@ function createTrie(lang = CONST.LOCALES.DEFAULT) { } else { trie.update(preferredLanguageName, {code: item.code, types: item.types, name: preferredLanguageName, suggestions: node.metaData.suggestions}); } - + // Add keywords of both the current language and the default language, in case current language isn't the default. - const keywords = _.get(langEmojis, [item.code, 'keywords'], []).concat(isDefaultLocale ? [] : _.get(localeEmojis, [CONST.LOCALES.DEFAULT, item.code, 'keywords'], []));; + const keywords = _.get(langEmojis, [item.code, 'keywords'], []).concat(isDefaultLocale ? [] : _.get(localeEmojis, [CONST.LOCALES.DEFAULT, item.code, 'keywords'], [])); for (let j = 0; j < keywords.length; j++) { const keywordNode = trie.search(keywords[j]); if (!keywordNode) { @@ -60,7 +60,6 @@ function createTrie(lang = CONST.LOCALES.DEFAULT) { return trie; } - const emojiTrie = _.reduce(supportedLanguages, (prev, cur) => ({...prev, [cur]: createTrie(cur)}), {}); Timing.end(CONST.TIMING.TRIE_INITIALIZATION); From 3a5927c595c8e97933e045d25be2d78646e60eb0 Mon Sep 17 00:00:00 2001 From: Thanos30 Date: Tue, 5 Sep 2023 14:35:42 +0300 Subject: [PATCH 3/4] name refactoring --- src/libs/EmojiTrie.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/libs/EmojiTrie.js b/src/libs/EmojiTrie.js index 7f396e5188af..b6cc68f57ec8 100644 --- a/src/libs/EmojiTrie.js +++ b/src/libs/EmojiTrie.js @@ -18,15 +18,15 @@ function createTrie(lang = CONST.LOCALES.DEFAULT) { return; } - const defaultName = item.name; - const preferredLanguageName = _.get(langEmojis, [item.code, 'name'], defaultName); + const englishName = item.name; + const localeName = _.get(langEmojis, [item.code, 'name'], englishName); // Add the actual name of the emoji for the current language - const node = trie.search(preferredLanguageName); + const node = trie.search(localeName); if (!node) { - trie.add(preferredLanguageName, {code: item.code, types: item.types, name: preferredLanguageName, suggestions: []}); + trie.add(localeName, {code: item.code, types: item.types, name: localeName, suggestions: []}); } else { - trie.update(preferredLanguageName, {code: item.code, types: item.types, name: preferredLanguageName, suggestions: node.metaData.suggestions}); + trie.update(localeName, {code: item.code, types: item.types, name: localeName, suggestions: node.metaData.suggestions}); } // Add keywords of both the current language and the default language, in case current language isn't the default. @@ -34,24 +34,24 @@ function createTrie(lang = CONST.LOCALES.DEFAULT) { for (let j = 0; j < keywords.length; j++) { const keywordNode = trie.search(keywords[j]); if (!keywordNode) { - trie.add(keywords[j], {suggestions: [{code: item.code, types: item.types, name: preferredLanguageName}]}); + trie.add(keywords[j], {suggestions: [{code: item.code, types: item.types, name: localeName}]}); } else { trie.update(keywords[j], { ...keywordNode.metaData, - suggestions: [...keywordNode.metaData.suggestions, {code: item.code, types: item.types, name: preferredLanguageName}], + suggestions: [...keywordNode.metaData.suggestions, {code: item.code, types: item.types, name: localeName}], }); } } // If current language isn't the default, prepend the English name of the emoji in the suggestions as well. if (!isDefaultLocale) { - const englishNode = trie.search(defaultName); + const englishNode = trie.search(englishName); if (!englishNode) { - trie.add(defaultName, {suggestions: [{code: item.code, types: item.types, name: preferredLanguageName}]}); + trie.add(englishName, {suggestions: [{code: item.code, types: item.types, name: localeName}]}); } else { - trie.update(defaultName, { + trie.update(englishName, { ...englishNode.metaData, - suggestions: [{code: item.code, types: item.types, name: preferredLanguageName}, ...englishNode.metaData.suggestions], + suggestions: [{code: item.code, types: item.types, name: localeName}, ...englishNode.metaData.suggestions], }); } } From f47d363b86c896b4889ba665692c1ad9d30456f8 Mon Sep 17 00:00:00 2001 From: Thanos30 Date: Tue, 5 Sep 2023 14:47:15 +0300 Subject: [PATCH 4/4] Add comments + Clear code --- src/libs/EmojiTrie.js | 4 ++-- src/libs/EmojiUtils.js | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/libs/EmojiTrie.js b/src/libs/EmojiTrie.js index b6cc68f57ec8..b0bd0d5eec5d 100644 --- a/src/libs/EmojiTrie.js +++ b/src/libs/EmojiTrie.js @@ -21,7 +21,6 @@ function createTrie(lang = CONST.LOCALES.DEFAULT) { const englishName = item.name; const localeName = _.get(langEmojis, [item.code, 'name'], englishName); - // Add the actual name of the emoji for the current language const node = trie.search(localeName); if (!node) { trie.add(localeName, {code: item.code, types: item.types, name: localeName, suggestions: []}); @@ -29,7 +28,7 @@ function createTrie(lang = CONST.LOCALES.DEFAULT) { trie.update(localeName, {code: item.code, types: item.types, name: localeName, suggestions: node.metaData.suggestions}); } - // Add keywords of both the current language and the default language, in case current language isn't the default. + // Add keywords for both the locale language and English to enable users to search using either language. const keywords = _.get(langEmojis, [item.code, 'keywords'], []).concat(isDefaultLocale ? [] : _.get(localeEmojis, [CONST.LOCALES.DEFAULT, item.code, 'keywords'], [])); for (let j = 0; j < keywords.length; j++) { const keywordNode = trie.search(keywords[j]); @@ -44,6 +43,7 @@ function createTrie(lang = CONST.LOCALES.DEFAULT) { } // If current language isn't the default, prepend the English name of the emoji in the suggestions as well. + // We do this because when the user types the english name of the emoji, we want to show the emoji in the suggestions before all the others. if (!isDefaultLocale) { const englishNode = trie.search(englishName); if (!englishNode) { diff --git a/src/libs/EmojiUtils.js b/src/libs/EmojiUtils.js index c8133023d80e..80665541e24b 100644 --- a/src/libs/EmojiUtils.js +++ b/src/libs/EmojiUtils.js @@ -320,7 +320,9 @@ function replaceEmojis(text, preferredSkinTone = CONST.EMOJI_DEFAULT_SKIN_TONE, for (let i = 0; i < emojiData.length; i++) { const name = emojiData[i].slice(1, -1); let checkEmoji = trie.search(name); - if ((!checkEmoji || !checkEmoji.metaData.code) && lang !== CONST.LOCALES.DEFAULT) { + // If the user has selected a language other than English, and the emoji doesn't exist in that language, + // we will check if the emoji exists in English. + if (lang !== CONST.LOCALES.DEFAULT && (!checkEmoji || !checkEmoji.metaData.code)) { const englishTrie = emojisTrie[CONST.LOCALES.DEFAULT]; if (englishTrie) { const englishEmoji = englishTrie.search(name);