diff --git a/packages/frontend/core/src/utils/__tests__/extract-emoji-icon.spec.ts b/packages/frontend/core/src/utils/__tests__/extract-emoji-icon.spec.ts index 3828b7e09a..a4031767fc 100644 --- a/packages/frontend/core/src/utils/__tests__/extract-emoji-icon.spec.ts +++ b/packages/frontend/core/src/utils/__tests__/extract-emoji-icon.spec.ts @@ -9,7 +9,22 @@ test('extract-emoji-icon', () => { }); expect(extractEmojiIcon('❤️123')).toEqual({ + emoji: '❤️', + rest: '123', + }); + + expect(extractEmojiIcon('➡️456')).toEqual({ + emoji: '➡️', + rest: '456', + }); + + expect(extractEmojiIcon('✈️789')).toEqual({ + emoji: '✈️', + rest: '789', + }); + + expect(extractEmojiIcon('plain text')).toEqual({ emoji: null, - rest: '❤️123', + rest: 'plain text', }); }); diff --git a/packages/frontend/core/src/utils/extract-emoji-icon.ts b/packages/frontend/core/src/utils/extract-emoji-icon.ts index 8fb7b1a1b3..83ca7dbfae 100644 --- a/packages/frontend/core/src/utils/extract-emoji-icon.ts +++ b/packages/frontend/core/src/utils/extract-emoji-icon.ts @@ -1,13 +1,16 @@ import Graphemer from 'graphemer'; +const emojiRe = + /(\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff])/g; export function extractEmojiIcon(text: string) { - const isStartsWithEmoji = /^(\p{Emoji_Presentation})/u.test(text); - if (isStartsWithEmoji) { + emojiRe.lastIndex = 0; + const match = emojiRe.exec(text); + if (match && match.index === 0) { // emoji like "👨🏻‍❤️‍💋‍👨🏻" are combined. Graphemer can handle these. const emojiEnd = Graphemer.nextBreak(text, 0); return { - emoji: text.substring(0, emojiEnd), - rest: text.substring(emojiEnd), + emoji: text.slice(0, emojiEnd), + rest: text.slice(emojiEnd), }; } return {