respect autoplay settings in gif dialog

This commit is contained in:
vineyardbovines
2026-05-28 20:20:29 -04:00
parent 3e46ca391f
commit 407a7ced19
@@ -1,9 +1,12 @@
import {useState} from 'react'
import {Image} from 'expo-image' import {Image} from 'expo-image'
import {useLingui} from '@lingui/react/macro' import {useLingui} from '@lingui/react/macro'
import {useAutoplayDisabled} from '#/state/preferences'
import {atoms as a, useTheme} from '#/alf' import {atoms as a, useTheme} from '#/alf'
import {Button} from '#/components/Button' import {Button} from '#/components/Button'
import {useAnalytics} from '#/analytics' import {useAnalytics} from '#/analytics'
import {IS_WEB} from '#/env'
import {type Gif} from '#/features/gifPicker/types' import {type Gif} from '#/features/gifPicker/types'
import {gifPreviewUrl} from '#/features/gifPicker/utils' import {gifPreviewUrl} from '#/features/gifPicker/utils'
@@ -17,6 +20,8 @@ export function GifPickerItem({
const ax = useAnalytics() const ax = useAnalytics()
const {t: l} = useLingui() const {t: l} = useLingui()
const t = useTheme() const t = useTheme()
const autoplayDisabled = useAutoplayDisabled()
const [isPreviewing, setIsPreviewing] = useState(false)
const [width, height] = gif.media_formats.tinygif.dims const [width, height] = gif.media_formats.tinygif.dims
const aspectRatio = width > 0 && height > 0 ? width / height : 1 const aspectRatio = width > 0 && height > 0 ? width / height : 1
@@ -26,6 +31,13 @@ export function GifPickerItem({
onSelectGif(gif) onSelectGif(gif)
} }
const shouldAnimate = !autoplayDisabled || isPreviewing
const sourceUri = gifPreviewUrl(
shouldAnimate
? gif.media_formats.tinygif.url
: gif.media_formats.preview.url,
)
return ( return (
<Button <Button
label={l({ label={l({
@@ -34,6 +46,10 @@ export function GifPickerItem({
'Accessibility label for an individual GIF tile in the picker grid. The placeholder is the GIFs title from the provider.', 'Accessibility label for an individual GIF tile in the picker grid. The placeholder is the GIFs title from the provider.',
})} })}
onPress={onPress} onPress={onPress}
onHoverIn={() => setIsPreviewing(true)}
onHoverOut={() => setIsPreviewing(false)}
onLongPress={() => setIsPreviewing(true)}
onPressOut={IS_WEB ? undefined : () => setIsPreviewing(false)}
style={a.w_full}> style={a.w_full}>
{({pressed}) => ( {({pressed}) => (
<Image <Image
@@ -47,7 +63,7 @@ export function GifPickerItem({
transform: [{scale: pressed ? 0.97 : 1}], transform: [{scale: pressed ? 0.97 : 1}],
}, },
]} ]}
source={{uri: gifPreviewUrl(gif.media_formats.tinygif.url)}} source={{uri: sourceUri}}
contentFit="cover" contentFit="cover"
accessibilityLabel={gif.title} accessibilityLabel={gif.title}
accessibilityHint="" accessibilityHint=""