From 3b3e0e6fde59c40d314f657411a38c71c46f60fd Mon Sep 17 00:00:00 2001 From: Lim Chee Aun Date: Wed, 14 Jun 2023 17:37:41 +0800 Subject: [PATCH] EmojiText component replacing dangerouslySetInnerHTML --- src/components/account-block.jsx | 11 +++------ src/components/account-info.jsx | 8 ++---- src/components/emoji-text.jsx | 42 ++++++++++++++++++++++++++++++++ src/components/name-text.jsx | 12 +++------ src/components/poll.jsx | 19 ++++++--------- src/components/status.jsx | 10 +++----- src/pages/account-statuses.jsx | 10 +++----- src/utils/emojify-text.js | 3 ++- 8 files changed, 69 insertions(+), 46 deletions(-) create mode 100644 src/components/emoji-text.jsx diff --git a/src/components/account-block.jsx b/src/components/account-block.jsx index a8598284..a9b93da2 100644 --- a/src/components/account-block.jsx +++ b/src/components/account-block.jsx @@ -2,11 +2,11 @@ import './account-block.css'; import { useNavigate } from 'react-router-dom'; -import emojifyText from '../utils/emojify-text'; import niceDateTime from '../utils/nice-date-time'; import states from '../utils/states'; import Avatar from './avatar'; +import EmojiText from './emoji-text'; function AccountBlock({ skeleton, @@ -46,7 +46,6 @@ function AccountBlock({ lastStatusAt, bot, } = account; - const displayNameWithEmoji = emojifyText(displayName, emojis); const [_, acct1, acct2] = acct.match(/([^@]+)(@.+)/i) || [, acct]; return ( @@ -72,11 +71,9 @@ function AccountBlock({ {displayName ? ( - + + + ) : ( {username} )} diff --git a/src/components/account-info.jsx b/src/components/account-info.jsx index 755965b0..1bbf00f7 100644 --- a/src/components/account-info.jsx +++ b/src/components/account-info.jsx @@ -4,7 +4,6 @@ import { Menu, MenuDivider, MenuItem, SubMenu } from '@szhsin/react-menu'; import { useEffect, useReducer, useRef, useState } from 'preact/hooks'; import { api } from '../utils/api'; -import emojifyText from '../utils/emojify-text'; import enhanceContent from '../utils/enhance-content'; import getHTMLText from '../utils/getHTMLText'; import handleContentLinks from '../utils/handle-content-links'; @@ -16,6 +15,7 @@ import store from '../utils/store'; import AccountBlock from './account-block'; import Avatar from './avatar'; +import EmojiText from './emoji-text'; import Icon from './icon'; import Link from './link'; import ListAddEdit from './list-add-edit'; @@ -301,11 +301,7 @@ function AccountInfo({ key={name} > - {' '} + {' '} {!!verifiedAt && }

{ + const { shortcode, staticUrl, url } = shortcodeObj; + const regex = new RegExp(`:${shortcode}:`, 'g'); + let match; + + while ((match = regex.exec(text))) { + const beforeText = text.substring(lastIndex, match.index); + if (beforeText) { + components.push(beforeText); + } + components.push( + {shortcode}, + ); + lastIndex = match.index + match[0].length; + } + }); + + const afterText = text.substring(lastIndex); + if (afterText) { + components.push(afterText); + } + + return components; +} + +export default EmojiText; diff --git a/src/components/name-text.jsx b/src/components/name-text.jsx index f2e79ece..f994518d 100644 --- a/src/components/name-text.jsx +++ b/src/components/name-text.jsx @@ -1,9 +1,9 @@ import './name-text.css'; -import emojifyText from '../utils/emojify-text'; import states from '../utils/states'; import Avatar from './avatar'; +import EmojiText from './emoji-text'; function NameText({ account, @@ -18,8 +18,6 @@ function NameText({ account; let { username } = account; - const displayNameWithEmoji = emojifyText(displayName, emojis); - const trimmedUsername = username.toLowerCase().trim(); const trimmedDisplayName = (displayName || '').toLowerCase().trim(); const shortenedDisplayName = trimmedDisplayName @@ -58,11 +56,9 @@ function NameText({ )} {displayName && !short ? ( <> - + + + {!showAcct && username && ( <> {' '} diff --git a/src/components/poll.jsx b/src/components/poll.jsx index c051c217..ad1ba118 100644 --- a/src/components/poll.jsx +++ b/src/components/poll.jsx @@ -1,8 +1,8 @@ import { useEffect, useRef, useState } from 'preact/hooks'; -import emojifyText from '../utils/emojify-text'; import shortenNumber from '../utils/shorten-number'; +import EmojiText from './emoji-text'; import Icon from './icon'; import RelativeTime from './relative-time'; @@ -112,11 +112,9 @@ export default function Poll({ }} >

- + + + {voted && ownVotes.includes(i) && ( <> {' '} @@ -179,12 +177,9 @@ export default function Poll({ disabled={uiState === 'loading'} readOnly={readOnly} /> - + + +
); diff --git a/src/components/status.jsx b/src/components/status.jsx index 60b4f7e7..a7420b8f 100644 --- a/src/components/status.jsx +++ b/src/components/status.jsx @@ -26,12 +26,12 @@ import { useSnapshot } from 'valtio'; import { snapshot } from 'valtio/vanilla'; import AccountBlock from '../components/account-block'; +import EmojiText from '../components/emoji-text'; import Loader from '../components/loader'; import Modal from '../components/modal'; import NameText from '../components/name-text'; import Poll from '../components/poll'; import { api } from '../utils/api'; -import emojifyText from '../utils/emojify-text'; import enhanceContent from '../utils/enhance-content'; import getTranslateTargetLanguage from '../utils/get-translate-target-language'; import getHTMLText from '../utils/getHTMLText'; @@ -926,11 +926,9 @@ function Status({ ref={spoilerContentRef} data-read-more={readMoreText} > -

+

+ +