Skip to content

Commit 55f7488

Browse files
committed
memoize custom emoji function uses
1 parent 00382d2 commit 55f7488

5 files changed

Lines changed: 19 additions & 6 deletions

File tree

src/components/EmojiWithTooltip/index.android.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
import {useMemo} from 'react';
12
import Text from '@components/Text';
23
import useThemeStyles from '@hooks/useThemeStyles';
34
import {containsCustomEmoji} from '@libs/EmojiUtils';
45
import type EmojiWithTooltipProps from './types';
56

67
function EmojiWithTooltip({emojiCode, style = {}}: EmojiWithTooltipProps) {
8+
const isCustomEmoji = useMemo(() => containsCustomEmoji(emojiCode), [emojiCode]);
79
const styles = useThemeStyles();
8-
return <Text style={[style, containsCustomEmoji(emojiCode) && styles.customEmojiFont]}>{emojiCode}</Text>;
10+
return <Text style={[style, isCustomEmoji && styles.customEmojiFont]}>{emojiCode}</Text>;
911
}
1012

1113
EmojiWithTooltip.displayName = 'EmojiWithTooltip';

src/components/LHNOptionsList/OptionRowLHN.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,11 @@ function OptionRowLHN({
137137
const contentContainerStyles = isInFocusMode ? [styles.flex1, styles.flexRow, styles.overflowHidden, StyleUtils.getCompactContentContainerStyles()] : [styles.flex1];
138138
const hoveredBackgroundColor = !!styles.sidebarLinkHover && 'backgroundColor' in styles.sidebarLinkHover ? styles.sidebarLinkHover.backgroundColor : theme.sidebar;
139139
const focusedBackgroundColor = styles.sidebarLinkActive.backgroundColor;
140-
const alternateTextContainsCustomEmojiWithText = containsCustomEmojiUtils(optionItem.alternateText) && !containsOnlyCustomEmoji(optionItem.alternateText);
140+
const alternateTextContainsCustomEmojiWithText = useMemo(
141+
() => containsCustomEmojiUtils(optionItem.alternateText) && !containsOnlyCustomEmoji(optionItem.alternateText),
142+
[optionItem.alternateText],
143+
);
144+
141145
/**
142146
* Show the ReportActionContextMenu modal popover.
143147
*

src/components/Text.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type {ForwardedRef} from 'react';
2-
import React, {useContext} from 'react';
2+
import React, {useContext, useMemo} from 'react';
33
// eslint-disable-next-line no-restricted-imports
44
import {Text as RNText, StyleSheet} from 'react-native';
55
import type {TextProps as RNTextProps, TextStyle} from 'react-native';
@@ -51,7 +51,12 @@ function Text(
5151
if (!componentStyle.lineHeight && componentStyle.fontSize === variables.fontSizeNormal && shouldUseDefaultLineHeight) {
5252
componentStyle.lineHeight = variables.fontSizeNormalHeight;
5353
}
54-
if (typeof children === 'string' && containsOnlyCustomEmoji(children)) {
54+
55+
const isOnlyCustomEmoji = useMemo(() => {
56+
return typeof children === 'string' ? containsOnlyCustomEmoji(children) : false;
57+
}, [children]);
58+
59+
if (isOnlyCustomEmoji) {
5560
componentStyle.fontFamily = FontUtils.fontFamily.single.CUSTOM_EMOJI_FONT?.fontFamily;
5661
}
5762

src/pages/home/report/comment/TextCommentFragment.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ function TextCommentFragment({fragment, styleAsDeleted, reportActionID, styleAsM
7070
// on native, we render it as text, not as html
7171
// on other device, only render it as text if the only difference is <br /> tag
7272
const containsOnlyEmojis = containsOnlyEmojisUtil(text ?? '');
73-
const containsOnlyCustomEmoji = containsOnlyCustomEmojiUtil(text);
73+
const containsOnlyCustomEmoji = useMemo(() => containsOnlyCustomEmojiUtil(text), [text]);
7474
const containsEmojis = CONST.REGEX.ALL_EMOJIS.test(text ?? '');
7575
if (!shouldRenderAsText(html, text ?? '') && !(containsOnlyEmojis && styleAsDeleted)) {
7676
const editedTag = fragment?.isEdited ? `<edited ${styleAsDeleted ? 'deleted' : ''}></edited>` : '';

src/pages/home/report/comment/shouldRenderAsText/index.native.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {Str} from 'expensify-common';
2+
import {useMemo} from 'react';
23
import {containsCustomEmoji} from '@libs/EmojiUtils';
34

45
/**
@@ -9,5 +10,6 @@ export default function shouldRenderAsText(html: string, text: string): boolean
910
// More info: https://github.com/Expensify/App/pull/35838#issuecomment-1964839350
1011
const htmlWithoutLineBreak = Str.replaceAll(html, '<br />', '\n');
1112
const htmlWithoutEmojiOpenTag = Str.replaceAll(htmlWithoutLineBreak, '<emoji>', '');
12-
return Str.replaceAll(htmlWithoutEmojiOpenTag, '</emoji>', '') === text && !containsCustomEmoji(text);
13+
const hasCustomEmoji = useMemo(() => containsCustomEmoji(text), [text]);
14+
return Str.replaceAll(htmlWithoutEmojiOpenTag, '</emoji>', '') === text && !hasCustomEmoji;
1315
}

0 commit comments

Comments
 (0)