Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
d38f775
feat: new emoji database
sangar-1028 Jun 15, 2023
08496e8
feat: update quick reactions(support es)
sangar-1028 Jun 15, 2023
51ac473
feat: all emojis and categories support es
sangar-1028 Jun 15, 2023
07b59e3
fix: import error
sangar-1028 Jun 15, 2023
8c18175
lint error
sangar-1028 Jun 15, 2023
91839ed
fix: merge main and fix conflicts
sangar-1028 Jun 15, 2023
d9835f9
fix: emoji suggestion bug
sangar-1028 Jun 15, 2023
b309e68
fix: Emoji and Report tests
sangar-1028 Jun 15, 2023
d3778b2
fix: conflicts
sangar-1028 Jun 15, 2023
23bb285
fix: nested property
sangar-1028 Jun 16, 2023
99b8343
fix: prettier
sangar-1028 Jun 16, 2023
f742447
fix: remove people-and-body category and corresponding icon, change c…
sangar-1028 Jun 16, 2023
2551336
fix: header emojis back to original
sangar-1028 Jun 17, 2023
61be178
fix: toggleReaction, quick emoji back to original
sangar-1028 Jun 17, 2023
d9820a1
Merge branch 'main' into fix/issue-16086
sangar-1028 Jun 17, 2023
e9eccaf
fix: remove wrong comments
sangar-1028 Jun 17, 2023
fe1d94b
fix: rename getEmojiName -> getLocalizedEmojiName
sangar-1028 Jun 17, 2023
1977161
fix: lint error
sangar-1028 Jun 17, 2023
ac4a5c2
fix: shortcode -> name
sangar-1028 Jun 17, 2023
a32d5a3
fix: toggle emoji reaction
sangar-1028 Jun 18, 2023
746c5af
fix: test and lint
sangar-1028 Jun 18, 2023
221c763
fix: remove shortcodes from tests
sangar-1028 Jun 18, 2023
fe06885
fix: remove differences
sangar-1028 Jun 18, 2023
555c8b4
fix: remove differences
sangar-1028 Jun 18, 2023
680fc05
fix: prettier error
sangar-1028 Jun 18, 2023
2dc64dd
fix: missing emoji
sangar-1028 Jun 18, 2023
fc90352
fix: emoji util function getEmojiName created
sangar-1028 Jun 18, 2023
18646ed
fix: prettier changes
sangar-1028 Jun 18, 2023
7ef92fc
fix: skintones order
sangar-1028 Jun 18, 2023
2ab63d5
fix: testing error due to skintones
sangar-1028 Jun 18, 2023
11f77ac
fix: use old English names
sangar-1028 Jun 18, 2023
2dbe1ed
feat: new emoji language files
sangar-1028 Jun 20, 2023
45dec32
feat: rename emoji language files
sangar-1028 Jun 20, 2023
361f3d9
fix: new emoji structure
sangar-1028 Jun 20, 2023
29070e3
fix: new structure of emoji
sangar-1028 Jun 20, 2023
70bc730
feat: support En as well for other locales
sangar-1028 Jun 20, 2023
353ace4
fix: tests
sangar-1028 Jun 20, 2023
71110cb
Merge branch 'main' into fix/issue-16086
sangar-1028 Jun 20, 2023
4bed2dd
fix: lint errors
sangar-1028 Jun 20, 2023
0df9868
fix: remove unused comments
sangar-1028 Jun 20, 2023
70cce1e
fix: conflicts
sangar-1028 Jun 28, 2023
467f49f
fix: conflicts
sangar-1028 Jun 28, 2023
a878f3a
fix: conflicts
sangar-1028 Jun 28, 2023
f9192ee
Merge branch 'main' into fix/issue-16086
sangar-1028 Jul 3, 2023
d7d91b8
fix: preferredLocaled added to BaseQuickEmojiReactions
sangar-1028 Jul 3, 2023
bf8e80e
fix: lint error
sangar-1028 Jul 3, 2023
6461f53
fix: conflicts
sangar-1028 Jul 3, 2023
cb4e9cf
fix: conflicts
sangar-1028 Jul 5, 2023
a3cd2c9
fix: rename emojiToReact -> reactionEmoji
sangar-1028 Jul 5, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,915 changes: 24 additions & 1,891 deletions assets/emojis.js → assets/emojis/common.js

Large diffs are not rendered by default.

5,440 changes: 5,440 additions & 0 deletions assets/emojis/en.js

Large diffs are not rendered by default.

7,252 changes: 7,252 additions & 0 deletions assets/emojis/es.js

Large diffs are not rendered by default.

36 changes: 36 additions & 0 deletions assets/emojis/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import _ from 'underscore';
import emojis from './common';
import enEmojis from './en';
import esEmojis from './es';

const emojiNameTable = _.reduce(
emojis,
(prev, cur) => {
const newValue = prev;
if (!cur.header) {
newValue[cur.name] = cur;
}
return newValue;
},
{},
);

const emojiCodeTable = _.reduce(
emojis,
(prev, cur) => {
const newValue = prev;
if (!cur.header) {
newValue[cur.code] = cur;
}
return newValue;
},
{},
);

const localeEmojis = {
en: enEmojis,
es: esEmojis,
};

export {emojiNameTable, emojiCodeTable, localeEmojis};
export {skinTones, categoryFrequentlyUsed, default} from './common';
2 changes: 1 addition & 1 deletion src/components/EmojiPicker/EmojiPickerMenu/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,7 @@ class EmojiPickerMenu extends Component {
this.setFirstNonHeaderIndex(this.emojis);
return;
}
const newFilteredEmojiList = EmojiUtils.suggestEmojis(`:${normalizedSearchTerm}`, this.emojis.length);
const newFilteredEmojiList = EmojiUtils.suggestEmojis(`:${normalizedSearchTerm}`, this.props.preferredLocale, this.emojis.length);

// Remove sticky header indices. There are no headers while searching and we don't want to make emojis sticky
this.setState({filteredEmojis: newFilteredEmojiList, headerIndices: [], highlightedIndex: 0});
Expand Down
4 changes: 2 additions & 2 deletions src/components/EmojiPicker/EmojiPickerMenu/index.native.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ class EmojiPickerMenu extends Component {

return;
}
const newFilteredEmojiList = EmojiUtils.suggestEmojis(`:${normalizedSearchTerm}`, this.emojis.length);
const newFilteredEmojiList = EmojiUtils.suggestEmojis(`:${normalizedSearchTerm}`, this.props.preferredLocale, this.emojis.length);

this.setState({
filteredEmojis: newFilteredEmojiList,
Expand Down Expand Up @@ -170,7 +170,7 @@ class EmojiPickerMenu extends Component {
if (item.header) {
return (
<View style={styles.emojiHeaderContainer}>
<Text style={styles.textLabelSupporting}>{this.props.translate(`emojiPicker.headers.${item.code}`)}</Text>
<Text style={styles.textLabelSupporting}>{this.props.translate(`emojiPicker.headers.${code}`)}</Text>
</View>
);
}
Expand Down
2 changes: 1 addition & 1 deletion src/components/Reactions/MiniQuickEmojiReactions.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ function MiniQuickEmojiReactions(props) {
<BaseMiniContextMenuItem
key={emoji.name}
isDelayButtonStateComplete={false}
tooltipText={`:${emoji.name}:`}
tooltipText={`:${EmojiUtils.getLocalizedEmojiName(emoji.name, props.preferredLocale)}:`}
onPress={Session.checkIfActionIsAllowed(() => props.onEmojiSelected(emoji))}
>
<Text style={[styles.miniQuickEmojiReactionText, styles.userSelectNone]}>{EmojiUtils.getPreferredEmojiCode(emoji, props.preferredSkinTone)}</Text>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,12 +34,15 @@ const baseQuickEmojiReactionsPropTypes = {
* ReportAction for EmojiPicker.
*/
reportAction: PropTypes.object,

preferredLocale: PropTypes.string,
};

const baseQuickEmojiReactionsDefaultProps = {
onWillShowPicker: () => {},
onPressOpenPicker: () => {},
reportAction: {},
preferredLocale: CONST.LOCALES.DEFAULT,
};

const propTypes = {
Expand All @@ -57,7 +60,7 @@ function BaseQuickEmojiReactions(props) {
<View style={styles.quickReactionsContainer}>
{_.map(CONST.QUICK_REACTIONS, (emoji) => (
<Tooltip
text={`:${emoji.name}:`}
text={`:${EmojiUtils.getLocalizedEmojiName(emoji.name, props.preferredLocale)}:`}
Comment thread
dummy-1111 marked this conversation as resolved.
key={emoji.name}
>
<View>
Expand Down Expand Up @@ -87,6 +90,9 @@ export default withOnyx({
preferredSkinTone: {
key: ONYXKEYS.PREFERRED_EMOJI_SKIN_TONE,
},
preferredLocale: {
key: ONYXKEYS.NVP_PREFERRED_LOCALE,
},
})(BaseQuickEmojiReactions);

export {baseQuickEmojiReactionsPropTypes};
9 changes: 5 additions & 4 deletions src/components/Reactions/ReportActionItemReactions.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@ import {View} from 'react-native';
import PropTypes from 'prop-types';
import styles from '../../styles/styles';
import EmojiReactionBubble from './EmojiReactionBubble';
import emojis from '../../../assets/emojis';
import AddReactionBubble from './AddReactionBubble';
import withCurrentUserPersonalDetails, {withCurrentUserPersonalDetailsDefaultProps, withCurrentUserPersonalDetailsPropTypes} from '../withCurrentUserPersonalDetails';
import withLocalize from '../withLocalize';
import compose from '../../libs/compose';
import * as Report from '../../libs/actions/Report';
import Tooltip from '../Tooltip';
import ReactionTooltipContent from './ReactionTooltipContent';
Expand Down Expand Up @@ -59,7 +60,7 @@ function ReportActionItemReactions(props) {
{_.map(reactionsWithCount, (reaction) => {
const reactionCount = reaction.users.length;
const reactionUsers = _.map(reaction.users, (sender) => sender.accountID);
const emoji = _.find(emojis, (e) => e.name === reaction.emoji);
const emoji = EmojiUtils.findEmojiByName(reaction.emoji);
const emojiCodes = EmojiUtils.getUniqueEmojiCodes(emoji, reaction.users);
const hasUserReacted = Report.hasAccountIDReacted(props.currentUserPersonalDetails.accountID, reactionUsers);

Expand All @@ -75,7 +76,7 @@ function ReportActionItemReactions(props) {
<Tooltip
renderTooltipContent={() => (
<ReactionTooltipContent
emojiName={reaction.emoji}
emojiName={EmojiUtils.getLocalizedEmojiName(reaction.emoji, props.preferredLocale)}
emojiCodes={emojiCodes}
accountIDs={reactionUsers}
currentUserPersonalDetails={props.currentUserPersonalDetails}
Expand Down Expand Up @@ -111,4 +112,4 @@ function ReportActionItemReactions(props) {
ReportActionItemReactions.displayName = 'ReportActionItemReactions';
ReportActionItemReactions.propTypes = propTypes;
ReportActionItemReactions.defaultProps = defaultProps;
export default withCurrentUserPersonalDetails(ReportActionItemReactions);
export default compose(withLocalize, withCurrentUserPersonalDetails)(ReportActionItemReactions);
62 changes: 39 additions & 23 deletions src/libs/EmojiTrie.js
Original file line number Diff line number Diff line change
@@ -1,37 +1,53 @@
import emojis from '../../assets/emojis';
import _ from 'underscore';
import emojis, {localeEmojis} from '../../assets/emojis';
import Trie from './Trie';
import Timing from './actions/Timing';
import CONST from '../CONST';

Timing.start(CONST.TIMING.TRIE_INITIALIZATION);

const emojisTrie = new Trie();
const supportedLanguages = [CONST.LOCALES.DEFAULT, CONST.LOCALES.ES];

// Inserting all emojis into the Trie object
for (let i = 0; i < emojis.length; i++) {
if (emojis[i].name) {
const node = emojisTrie.search(emojis[i].name);
if (!node) {
emojisTrie.add(emojis[i].name, {code: emojis[i].code, types: emojis[i].types, suggestions: []});
} else {
emojisTrie.update(emojis[i].name, {code: emojis[i].code, types: emojis[i].types, suggestions: node.metaData.suggestions});
function createTrie(lang = CONST.LOCALES.DEFAULT) {
const trie = new Trie();
const langEmojis = localeEmojis[lang];
const isDefaultLocale = lang === CONST.LOCALES.DEFAULT;

_.forEach(emojis, (item) => {
if (item.header) {
return;
}

if (emojis[i].keywords) {
for (let j = 0; j < emojis[i].keywords.length; j++) {
const keywordNode = emojisTrie.search(emojis[i].keywords[j]);
if (!keywordNode) {
emojisTrie.add(emojis[i].keywords[j], {suggestions: [{code: emojis[i].code, types: emojis[i].types, name: emojis[i].name}]});
} else {
emojisTrie.update(emojis[i].keywords[j], {
...keywordNode.metaData,
suggestions: [...keywordNode.metaData.suggestions, {code: emojis[i].code, types: emojis[i].types, name: emojis[i].name}],
});
}
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'], []));
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}]});
} else {
trie.update(keywords[j], {
...keywordNode.metaData,
suggestions: [...keywordNode.metaData.suggestions, {code: item.code, types: item.types, name}],
});
}
}
}
});

return trie;
}

const emojiTrie = _.reduce(supportedLanguages, (prev, cur) => ({...prev, [cur]: createTrie(cur)}), {});

Timing.end(CONST.TIMING.TRIE_INITIALIZATION);
Comment thread
dummy-1111 marked this conversation as resolved.

export default emojisTrie;
export default emojiTrie;
Loading