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

76 lines
1.8 KiB
TypeScript
Raw Normal View History

2020-10-31 21:04:46 +01:00
import React from 'react'
2020-12-01 00:44:28 +01:00
import { Image, StyleSheet, Text, View } from 'react-native'
2020-12-13 14:04:25 +01:00
import { useTheme } from '@utils/styles/ThemeManager'
import { StyleConstants } from '@utils/styles/constants'
2020-11-24 00:18:47 +01:00
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-12-03 01:28:56 +01:00
numberOfLines?: number
2020-10-31 21:04:46 +01:00
}
2020-11-23 00:07:32 +01:00
const Emojis: React.FC<Props> = ({
content,
emojis,
size,
2020-12-03 01:28:56 +01:00
fontBold = false,
numberOfLines
2020-11-23 00:07:32 +01:00
}) => {
const { theme } = useTheme()
const styles = StyleSheet.create({
text: {
fontSize: size,
color: theme.primary,
2020-11-30 00:24:53 +01:00
...(fontBold && { fontWeight: StyleConstants.Font.Weight.Bold })
2020-11-23 00:07:32 +01:00
},
image: {
width: size,
2020-12-01 00:44:28 +01:00
height: size,
paddingTop: 1,
marginBottom: -1
2020-11-23 00:07:32 +01:00
}
})
2020-10-31 21:04:46 +01:00
const hasEmojis = content.match(regexEmoji)
2020-11-23 00:07:32 +01:00
2020-12-01 00:44:28 +01:00
return (
2020-12-03 01:28:56 +01:00
<Text numberOfLines={numberOfLines || undefined}>
2020-10-31 21:04:46 +01:00
{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
) : (
2020-12-01 00:44:28 +01:00
<View key={i} style={styles.image}>
<Image
key={i}
resizeMode='contain'
source={{ uri: emojis[emojiIndex].url }}
style={{ width: '100%', height: '100%' }}
/>
</View>
2020-10-31 21:04:46 +01:00
)
} else {
2020-12-01 00:44:28 +01:00
return str ? (
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-12-01 00:44:28 +01:00
) : (
undefined
2020-10-31 21:04:46 +01:00
)
}
})}
2020-12-01 00:44:28 +01:00
</Text>
2020-10-31 21:04:46 +01:00
)
}
export default Emojis