tooot/src/components/Timelines/Timeline/Shared/Emojis.tsx

69 lines
1.5 KiB
TypeScript
Raw Normal View History

2020-10-31 21:04:46 +01:00
import React from 'react'
2020-11-23 00:07:32 +01:00
import { Image, StyleSheet, Text } from 'react-native'
import { useTheme } from 'src/utils/styles/ThemeManager'
2020-10-31 21:04:46 +01:00
const regexEmoji = new RegExp(/(:[a-z0-9_]+:)/)
export interface Props {
content: string
emojis: Mastodon.Emoji[]
2020-11-23 00:07:32 +01:00
size: number
fontBold?: boolean
2020-10-31 21:04:46 +01:00
}
2020-11-23 00:07:32 +01:00
const Emojis: React.FC<Props> = ({
content,
emojis,
size,
fontBold = false
}) => {
const { theme } = useTheme()
const styles = StyleSheet.create({
text: {
fontSize: size,
lineHeight: size + 2,
color: theme.primary,
...(fontBold && { fontWeight: 'bold' })
},
image: {
width: size,
height: size
}
})
2020-10-31 21:04:46 +01:00
const hasEmojis = content.match(regexEmoji)
2020-11-23 00:07:32 +01:00
2020-10-31 21:04:46 +01:00
return hasEmojis ? (
<>
{content.split(regexEmoji).map((str, i) => {
if (str.match(regexEmoji)) {
const emojiShortcode = str.split(regexEmoji)[1]
const emojiIndex = emojis.findIndex(emoji => {
return emojiShortcode === `:${emoji.shortcode}:`
})
return emojiIndex === -1 ? (
2020-11-23 00:07:32 +01:00
<Text key={i} style={styles.text}>
{emojiShortcode}
</Text>
2020-10-31 21:04:46 +01:00
) : (
<Image
key={i}
source={{ uri: emojis[emojiIndex].url }}
2020-11-23 00:07:32 +01:00
style={styles.image}
2020-10-31 21:04:46 +01:00
/>
)
} else {
return (
2020-11-23 00:07:32 +01:00
<Text key={i} style={styles.text}>
2020-10-31 21:04:46 +01:00
{str}
</Text>
)
}
})}
</>
) : (
2020-11-23 00:07:32 +01:00
<Text style={styles.text}>{content}</Text>
2020-10-31 21:04:46 +01:00
)
}
export default Emojis