mirror of
https://github.com/tooot-app/app
synced 2025-04-27 08:28:55 +02:00
107 lines
2.7 KiB
TypeScript
107 lines
2.7 KiB
TypeScript
import analytics from '@components/analytics'
|
|
import GracefullyImage from '@components/GracefullyImage'
|
|
import openLink from '@components/openLink'
|
|
import { useNavigation } from '@react-navigation/native'
|
|
import { StyleConstants } from '@utils/styles/constants'
|
|
import { useTheme } from '@utils/styles/ThemeManager'
|
|
import React from 'react'
|
|
import { Pressable, StyleSheet, Text, View } from 'react-native'
|
|
|
|
export interface Props {
|
|
card: Mastodon.Card
|
|
}
|
|
|
|
const TimelineCard = React.memo(
|
|
({ card }: Props) => {
|
|
const { colors } = useTheme()
|
|
const navigation = useNavigation()
|
|
|
|
return (
|
|
<Pressable
|
|
accessible
|
|
accessibilityRole='link'
|
|
style={[styles.card, { borderColor: colors.border }]}
|
|
onPress={async () => {
|
|
analytics('timeline_shared_card_press')
|
|
await openLink(card.url, navigation)
|
|
}}
|
|
testID='base'
|
|
>
|
|
{card.image ? (
|
|
<GracefullyImage
|
|
uri={{ original: card.image }}
|
|
blurhash={card.blurhash}
|
|
style={styles.left}
|
|
imageStyle={styles.image}
|
|
/>
|
|
) : null}
|
|
<View style={styles.right}>
|
|
<Text
|
|
numberOfLines={2}
|
|
style={[styles.rightTitle, { color: colors.primaryDefault }]}
|
|
testID='title'
|
|
>
|
|
{card.title}
|
|
</Text>
|
|
{card.description ? (
|
|
<Text
|
|
numberOfLines={1}
|
|
style={[
|
|
styles.rightDescription,
|
|
{ color: colors.primaryDefault }
|
|
]}
|
|
testID='description'
|
|
>
|
|
{card.description}
|
|
</Text>
|
|
) : null}
|
|
<Text
|
|
numberOfLines={1}
|
|
style={[styles.rightLink, { color: colors.secondary }]}
|
|
>
|
|
{card.url}
|
|
</Text>
|
|
</View>
|
|
</Pressable>
|
|
)
|
|
},
|
|
() => true
|
|
)
|
|
|
|
const styles = StyleSheet.create({
|
|
card: {
|
|
flex: 1,
|
|
flexDirection: 'row',
|
|
height: StyleConstants.Font.LineHeight.M * 5,
|
|
marginTop: StyleConstants.Spacing.M,
|
|
borderWidth: StyleSheet.hairlineWidth,
|
|
borderRadius: 6,
|
|
overflow: 'hidden'
|
|
},
|
|
left: {
|
|
flexBasis: StyleConstants.Font.LineHeight.M * 5
|
|
},
|
|
image: {
|
|
borderTopLeftRadius: 6,
|
|
borderBottomLeftRadius: 6
|
|
},
|
|
right: {
|
|
flex: 1,
|
|
padding: StyleConstants.Spacing.S
|
|
},
|
|
rightTitle: {
|
|
...StyleConstants.FontStyle.S,
|
|
marginBottom: StyleConstants.Spacing.XS,
|
|
fontWeight: StyleConstants.Font.Weight.Bold
|
|
},
|
|
rightDescription: {
|
|
...StyleConstants.FontStyle.S,
|
|
marginBottom: StyleConstants.Spacing.XS
|
|
},
|
|
rightLink: {
|
|
...StyleConstants.FontStyle.S
|
|
}
|
|
})
|
|
|
|
export default TimelineCard
|