|
|
|
export type SizeClassType = 'default' | 'small' | 'medium' | 'large' | 'jumbo';
|
|
|
|
|
|
|
|
function getRegexUnicodeEmojis() {
|
|
|
|
return /\p{Emoji_Presentation}/gu;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getCountOfAllMatches(str: string) {
|
|
|
|
const regex = getRegexUnicodeEmojis();
|
|
|
|
|
|
|
|
const matches = str.match(regex);
|
|
|
|
|
|
|
|
return matches?.length || 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
function hasNormalCharacters(str: string) {
|
|
|
|
const noEmoji = str.replace(getRegexUnicodeEmojis(), '').trim();
|
|
|
|
return noEmoji.length > 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
export function getEmojiSizeClass(str: string): SizeClassType {
|
|
|
|
if (hasNormalCharacters(str)) {
|
|
|
|
return 'small';
|
|
|
|
}
|
|
|
|
|
|
|
|
const emojiCount = getCountOfAllMatches(str);
|
|
|
|
if (emojiCount > 8) {
|
|
|
|
return 'small';
|
|
|
|
} else if (emojiCount > 6) {
|
|
|
|
return 'small';
|
|
|
|
} else if (emojiCount > 4) {
|
|
|
|
return 'medium';
|
|
|
|
} else if (emojiCount > 2) {
|
|
|
|
return 'large';
|
|
|
|
} else {
|
|
|
|
return 'jumbo';
|
|
|
|
}
|
|
|
|
}
|