import React from 'react' import { Pressable, type StyleProp, StyleSheet, TouchableOpacity, View, type ViewStyle, } from 'react-native' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {HITSLOP_20} from '#/lib/constants' import {type EmbedPlayerParams} from '#/lib/strings/embed-player' import {isWeb} from '#/platform/detection' import {useAutoplayDisabled} from '#/state/preferences' import {useLargeAltBadgeEnabled} from '#/state/preferences/large-alt-badge' import {atoms as a, useTheme} from '#/alf' import {Fill} from '#/components/Fill' import {Loader} from '#/components/Loader' import * as Prompt from '#/components/Prompt' import {Text} from '#/components/Typography' import {PlayButtonIcon} from '#/components/video/PlayButtonIcon' import {GifView} from '../../../../../modules/expo-bluesky-gif-view' import {type GifViewStateChangeEvent} from '../../../../../modules/expo-bluesky-gif-view/src/GifView.types' function PlaybackControls({ onPress, isPlaying, isLoaded, }: { onPress: () => void isPlaying: boolean isLoaded: boolean }) { const {_} = useLingui() const t = useTheme() return ( {!isLoaded ? ( ) : !isPlaying ? ( ) : undefined} ) } export function GifEmbed({ params, thumb, altText, isPreferredAltText, hideAlt, style = {width: '100%'}, }: { params: EmbedPlayerParams thumb: string | undefined altText: string isPreferredAltText: boolean hideAlt?: boolean style?: StyleProp }) { const t = useTheme() const {_} = useLingui() const autoplayDisabled = useAutoplayDisabled() const playerRef = React.useRef(null) const [playerState, setPlayerState] = React.useState<{ isPlaying: boolean isLoaded: boolean }>({ isPlaying: !autoplayDisabled, isLoaded: false, }) const onPlayerStateChange = React.useCallback( (e: GifViewStateChangeEvent) => { setPlayerState(e.nativeEvent) }, [], ) const onPress = React.useCallback(() => { playerRef.current?.toggleAsync() }, []) return ( {!playerState.isPlaying && ( )} {!hideAlt && isPreferredAltText && } ) } function AltText({text}: {text: string}) { const control = Prompt.usePromptControl() const largeAltBadge = useLargeAltBadgeEnabled() const {_} = useLingui() return ( <> ALT Alt Text {text} control.close()} cta={_(msg`Close`)} color="secondary" /> ) } const styles = StyleSheet.create({ altContainer: { backgroundColor: 'rgba(0, 0, 0, 0.75)', borderRadius: 6, paddingHorizontal: isWeb ? 8 : 6, paddingVertical: isWeb ? 6 : 3, position: 'absolute', // Related to margin/gap hack. This keeps the alt label in the same position // on all platforms right: isWeb ? 8 : 5, bottom: isWeb ? 8 : 5, zIndex: 2, }, alt: { color: 'white', fontSize: isWeb ? 10 : 7, fontWeight: '600', }, })