diff options
Diffstat (limited to 'src/view/com/composer/ExternalEmbed.tsx')
-rw-r--r-- | src/view/com/composer/ExternalEmbed.tsx | 70 |
1 files changed, 46 insertions, 24 deletions
diff --git a/src/view/com/composer/ExternalEmbed.tsx b/src/view/com/composer/ExternalEmbed.tsx index 3c2bf762d..321e29b30 100644 --- a/src/view/com/composer/ExternalEmbed.tsx +++ b/src/view/com/composer/ExternalEmbed.tsx @@ -1,11 +1,12 @@ import React from 'react' -import {TouchableOpacity, View} from 'react-native' +import {StyleProp, TouchableOpacity, View, ViewStyle} from 'react-native' import {FontAwesomeIcon} from '@fortawesome/react-native-fontawesome' import {msg} from '@lingui/macro' import {useLingui} from '@lingui/react' import {ExternalEmbedDraft} from 'lib/api/index' import {s} from 'lib/styles' +import {Gif} from 'state/queries/tenor' import {ExternalLinkEmbed} from 'view/com/util/post-embeds/ExternalLinkEmbed' import {atoms as a, useTheme} from '#/alf' import {Loader} from '#/components/Loader' @@ -14,9 +15,11 @@ import {Text} from '#/components/Typography' export const ExternalEmbed = ({ link, onRemove, + gif, }: { link?: ExternalEmbedDraft onRemove: () => void + gif?: Gif }) => { const t = useTheme() const {_} = useLingui() @@ -34,45 +37,38 @@ export const ExternalEmbed = ({ if (!link) return null + const loadingStyle: ViewStyle | undefined = gif + ? { + aspectRatio: + gif.media_formats.gif.dims[0] / gif.media_formats.gif.dims[1], + width: '100%', + } + : undefined + return ( - <View - style={[ - a.border, - a.rounded_sm, - a.mt_2xl, - a.mb_xl, - a.overflow_hidden, - t.atoms.border_contrast_medium, - ]}> + <View style={[a.mb_xl, a.overflow_hidden, t.atoms.border_contrast_medium]}> {link.isLoading ? ( - <View - style={[ - a.align_center, - a.justify_center, - a.py_5xl, - t.atoms.bg_contrast_25, - ]}> + <Container style={loadingStyle}> <Loader size="xl" /> - </View> + </Container> ) : link.meta?.error ? ( - <View - style={[a.justify_center, a.p_md, a.gap_xs, t.atoms.bg_contrast_25]}> + <Container style={[a.align_start, a.p_md, a.gap_xs]}> <Text numberOfLines={1} style={t.atoms.text_contrast_high}> {link.uri} </Text> <Text numberOfLines={2} style={[{color: t.palette.negative_400}]}> - {link.meta.error} + {link.meta?.error} </Text> - </View> + </Container> ) : linkInfo ? ( - <View style={{pointerEvents: 'none'}}> + <View style={{pointerEvents: !gif ? 'none' : 'auto'}}> <ExternalLinkEmbed link={linkInfo} /> </View> ) : null} <TouchableOpacity style={{ position: 'absolute', - top: 10, + top: 16, right: 10, height: 36, width: 36, @@ -91,3 +87,29 @@ export const ExternalEmbed = ({ </View> ) } + +function Container({ + style, + children, +}: { + style?: StyleProp<ViewStyle> + children: React.ReactNode +}) { + const t = useTheme() + return ( + <View + style={[ + a.mt_sm, + a.rounded_sm, + a.border, + a.align_center, + a.justify_center, + a.py_5xl, + t.atoms.bg_contrast_25, + t.atoms.border_contrast_medium, + style, + ]}> + {children} + </View> + ) +} |