diff options
author | dan <dan.abramov@gmail.com> | 2024-11-21 22:52:16 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-21 22:52:16 +0000 |
commit | dc3a42edb1bcdb8c7f07111e936dddcfac1c1bb1 (patch) | |
tree | 7508231ca720f6bc3a833cb6504443685c4115b2 /src/components | |
parent | 84724bb940a827a7020da6ccbd6fa80f7209a455 (diff) | |
download | voidsky-dc3a42edb1bcdb8c7f07111e936dddcfac1c1bb1.tar.zst |
Reduce <Text> nesting (#6615)
* Move isOnlyEmoji out of RichText To fix Fast Refresh. * Make renderChildrenWithEmoji work with any children * Always go through UITextView for consistency It already contains the `selectable` and `iOS` checks inside. * Move `emoji` check into `renderChildrenWithEmoji` * Remove unnecessary intermediate UITextView nodes * Make childHasEmoji check recursive It didn't handle nested arrays etc correctly before. * Remove the "children must be string" limitation Should not be necessary now that we correctly handle nested arrays etc. * Fix unnecessary regex reallocation This doesn't have a global flag so it's okay to reuse. * Remove unnecessary <Text> wrapper in RichText
Diffstat (limited to 'src/components')
-rw-r--r-- | src/components/RichText.tsx | 15 | ||||
-rw-r--r-- | src/components/Typography.tsx | 8 | ||||
-rw-r--r-- | src/components/dms/MessageItem.tsx | 3 |
3 files changed, 6 insertions, 20 deletions
diff --git a/src/components/RichText.tsx b/src/components/RichText.tsx index e2d05ac6c..6d7e50e48 100644 --- a/src/components/RichText.tsx +++ b/src/components/RichText.tsx @@ -9,6 +9,7 @@ import {NavigationProp} from '#/lib/routes/types' import {toShortUrl} from '#/lib/strings/url-helpers' import {isNative} from '#/platform/detection' import {atoms as a, flatten, native, TextStyleProp, useTheme, web} from '#/alf' +import {isOnlyEmoji} from '#/alf/typography' import {useInteractionState} from '#/components/hooks/useInteractionState' import {InlineLinkText, LinkProps} from '#/components/Link' import {ProfileHoverCard} from '#/components/ProfileHoverCard' @@ -150,17 +151,14 @@ export function RichText({ />, ) } else { - els.push( - <Text key={key} emoji style={plainStyles}> - {segment.text} - </Text>, - ) + els.push(segment.text) } key++ } return ( <Text + emoji selectable={selectable} testID={testID} style={plainStyles} @@ -250,10 +248,3 @@ function RichTextTag({ </React.Fragment> ) } - -export function isOnlyEmoji(text: string) { - return ( - text.length <= 15 && - /^[\p{Emoji_Presentation}\p{Extended_Pictographic}]+$/u.test(text) - ) -} diff --git a/src/components/Typography.tsx b/src/components/Typography.tsx index 4bcbf9f09..3e202cb8f 100644 --- a/src/components/Typography.tsx +++ b/src/components/Typography.tsx @@ -1,11 +1,9 @@ import {UITextView} from 'react-native-uitextview' import {logger} from '#/logger' -import {isIOS} from '#/platform/detection' import {atoms, flatten, useAlf, useTheme, web} from '#/alf' import { childHasEmoji, - childIsString, normalizeTextStyles, renderChildrenWithEmoji, TextProps, @@ -39,10 +37,6 @@ export function Text({ `Text: emoji detected but emoji not enabled: "${children}"\n\nPlease add <Text emoji />'`, ) } - - if (emoji && !childIsString(children)) { - logger.error('Text: when <Text emoji />, children can only be strings.') - } } const shared = { @@ -55,7 +49,7 @@ export function Text({ return ( <UITextView {...shared}> - {isIOS && emoji ? renderChildrenWithEmoji(children, shared) : children} + {renderChildrenWithEmoji(children, shared, emoji ?? false)} </UITextView> ) } diff --git a/src/components/dms/MessageItem.tsx b/src/components/dms/MessageItem.tsx index 52220e2ca..79f0997fd 100644 --- a/src/components/dms/MessageItem.tsx +++ b/src/components/dms/MessageItem.tsx @@ -19,10 +19,11 @@ import {ConvoItem} from '#/state/messages/convo/types' import {useSession} from '#/state/session' import {TimeElapsed} from '#/view/com/util/TimeElapsed' import {atoms as a, useTheme} from '#/alf' +import {isOnlyEmoji} from '#/alf/typography' import {ActionsWrapper} from '#/components/dms/ActionsWrapper' import {InlineLinkText} from '#/components/Link' import {Text} from '#/components/Typography' -import {isOnlyEmoji, RichText} from '../RichText' +import {RichText} from '../RichText' import {DateDivider} from './DateDivider' import {MessageItemEmbed} from './MessageItemEmbed' import {localDateString} from './util' |