Skip to content

Commit 33020e7

Browse files
authored
Merge pull request Expensify#66081 from Expensify/cmartins-fix-custom-emoji-for-header-in-threads
[CP Staging] fix custom emoji for header in threads
2 parents 73c50d5 + 5eb7e86 commit 33020e7

7 files changed

Lines changed: 41 additions & 9 deletions

File tree

src/components/DisplayNames/index.native.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,31 @@
1-
import React from 'react';
1+
import React, {useMemo} from 'react';
22
import Text from '@components/Text';
33
import useLocalize from '@hooks/useLocalize';
4+
import {containsCustomEmoji, containsOnlyCustomEmoji} from '@libs/EmojiUtils';
45
import Parser from '@libs/Parser';
56
import StringUtils from '@libs/StringUtils';
7+
import TextWithEmojiFragment from '@pages/home/report/comment/TextWithEmojiFragment';
68
import type DisplayNamesProps from './types';
79

810
// As we don't have to show tooltips of the Native platform so we simply render the full display names list.
911
function DisplayNames({accessibilityLabel, fullTitle, textStyles = [], numberOfLines = 1, renderAdditionalText}: DisplayNamesProps) {
1012
const {translate} = useLocalize();
13+
const titleContainsTextAndCustomEmoji = useMemo(() => !containsCustomEmoji(fullTitle) && containsOnlyCustomEmoji(fullTitle), [fullTitle]);
1114
return (
1215
<Text
1316
accessibilityLabel={accessibilityLabel}
1417
style={textStyles}
1518
numberOfLines={numberOfLines}
1619
testID={DisplayNames.displayName}
1720
>
18-
{StringUtils.lineBreaksToSpaces(Parser.htmlToText(fullTitle)) || translate('common.hidden')}
21+
{titleContainsTextAndCustomEmoji ? (
22+
<TextWithEmojiFragment
23+
message={StringUtils.lineBreaksToSpaces(Parser.htmlToText(fullTitle)) || translate('common.hidden')}
24+
style={textStyles}
25+
/>
26+
) : (
27+
StringUtils.lineBreaksToSpaces(Parser.htmlToText(fullTitle)) || translate('common.hidden')
28+
)}
1929
{renderAdditionalText?.()}
2030
</Text>
2131
);

src/components/LHNOptionsList/OptionRowLHN.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ function OptionRowLHN({
323323
<TextWithEmojiFragment
324324
message={Parser.htmlToText(optionItem.alternateText)}
325325
style={[alternateTextStyle, styles.mh0]}
326-
isAlternateText
326+
alignCustomEmoji
327327
/>
328328
) : (
329329
Parser.htmlToText(optionItem.alternateText)

src/components/MenuItem.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ import useThemeStyles from '@hooks/useThemeStyles';
1111
import ControlSelection from '@libs/ControlSelection';
1212
import convertToLTR from '@libs/convertToLTR';
1313
import {canUseTouchScreen} from '@libs/DeviceCapabilities';
14+
import {containsCustomEmoji, containsOnlyCustomEmoji} from '@libs/EmojiUtils';
1415
import getButtonState from '@libs/getButtonState';
1516
import mergeRefs from '@libs/mergeRefs';
1617
import Parser from '@libs/Parser';
1718
import type {AvatarSource} from '@libs/UserUtils';
19+
import TextWithEmojiFragment from '@pages/home/report/comment/TextWithEmojiFragment';
1820
import {showContextMenu} from '@pages/home/report/ContextMenu/ReportActionContextMenu';
1921
import variables from '@styles/variables';
2022
import {callFunctionIfActionIsAllowed} from '@userActions/Session';
@@ -601,6 +603,18 @@ function MenuItem(
601603
);
602604
}
603605

606+
const titleContainsTextAndCustomEmoji = containsCustomEmoji(title ?? '') && !containsOnlyCustomEmoji(title ?? '');
607+
608+
if (title && titleContainsTextAndCustomEmoji) {
609+
return (
610+
<TextWithEmojiFragment
611+
message={convertToLTR(title) || ''}
612+
style={combinedTitleTextStyle}
613+
alignCustomEmoji
614+
/>
615+
);
616+
}
617+
604618
return title ? convertToLTR(title) : '';
605619
};
606620

src/components/Text.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,15 @@ function Text(
5353
}
5454

5555
const isOnlyCustomEmoji = useMemo(() => {
56-
return typeof children === 'string' ? containsOnlyCustomEmoji(children) : false;
56+
if (typeof children === 'string') {
57+
return containsOnlyCustomEmoji(children);
58+
}
59+
if (Array.isArray(children)) {
60+
return children.every((child) => {
61+
return child === null || (typeof child === 'string' && containsOnlyCustomEmoji(child));
62+
});
63+
}
64+
return false;
5765
}, [children]);
5866

5967
if (isOnlyCustomEmoji) {

src/pages/home/report/comment/TextWithEmojiFragment/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import convertToLTR from '@libs/convertToLTR';
55
import {splitTextWithEmojis} from '@libs/EmojiUtils';
66
import type TextWithEmojiFragmentProps from './types';
77

8-
function TextWithEmojiFragment({message = '', style, isAlternateText = false}: TextWithEmojiFragmentProps) {
8+
function TextWithEmojiFragment({message = '', style, alignCustomEmoji = false}: TextWithEmojiFragmentProps) {
99
const styles = useThemeStyles();
1010
const processedTextArray = useMemo(() => splitTextWithEmojis(message), [message]);
1111
return (
@@ -15,7 +15,7 @@ function TextWithEmojiFragment({message = '', style, isAlternateText = false}: T
1515
<Text
1616
// eslint-disable-next-line react/no-array-index-key
1717
key={index}
18-
style={isAlternateText ? style : styles.emojisWithTextFontSize}
18+
style={alignCustomEmoji ? style : styles.emojisWithTextFontSize}
1919
>
2020
{text}
2121
</Text>

src/pages/home/report/comment/TextWithEmojiFragment/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ type TextWithEmojiFragmentProps = {
88
style: StyleProp<TextStyle>;
99

1010
/** Whether the text is alternate text */
11-
isAlternateText?: boolean;
11+
alignCustomEmoji?: boolean;
1212
};
1313

1414
export default TextWithEmojiFragmentProps;

src/styles/utils/FontUtils/fontFamily/multiFontFamily/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ const fontFamily: FontFamilyStyles = {
4141
fontWeight: fontWeight.normal,
4242
},
4343
EXP_NEUE_BOLD: {
44-
fontFamily: 'Expensify Neue, Segoe UI Emoji, Noto Color Emoji',
44+
fontFamily: 'Expensify Neue, Segoe UI Emoji, Noto Color Emoji, Custom Emoji Font',
4545
fontStyle: 'normal',
4646
fontWeight: fontWeight.bold,
4747
},
@@ -57,7 +57,7 @@ const fontFamily: FontFamilyStyles = {
5757
},
5858

5959
EXP_NEW_KANSAS_MEDIUM: {
60-
fontFamily: 'Expensify New Kansas, Segoe UI Emoji, Noto Color Emoji',
60+
fontFamily: 'Expensify New Kansas, Segoe UI Emoji, Noto Color Emoji, Custom Emoji Font',
6161
fontStyle: 'normal',
6262
fontWeight: fontWeight.medium,
6363
},

0 commit comments

Comments
 (0)