import React, {useCallback, useState} from 'react' import {TouchableOpacity, View} from 'react-native' import {AppBskyEmbedExternal} from '@atproto/api' import {msg, Trans} from '@lingui/macro' import {useLingui} from '@lingui/react' import {ExternalEmbedDraft} from '#/lib/api' import {HITSLOP_10, MAX_ALT_TEXT} from '#/lib/constants' import {parseAltFromGIFDescription} from '#/lib/gif-alt-text' import { EmbedPlayerParams, parseEmbedPlayerFromUrl, } from '#/lib/strings/embed-player' import {enforceLen} from '#/lib/strings/helpers' import {isAndroid} from '#/platform/detection' import {Gif} from '#/state/queries/tenor' import {atoms as a, native, useTheme} from '#/alf' import {Button, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import * as TextField from '#/components/forms/TextField' import {Check_Stroke2_Corner0_Rounded as Check} from '#/components/icons/Check' import {PlusSmall_Stroke2_Corner0_Rounded as Plus} from '#/components/icons/Plus' import {Text} from '#/components/Typography' import {GifEmbed} from '../util/post-embeds/GifEmbed' import {AltTextReminder} from './photos/Gallery' export function GifAltText({ link: linkProp, gif, onSubmit, }: { link: ExternalEmbedDraft gif?: Gif onSubmit: (alt: string) => void }) { const control = Dialog.useDialogControl() const {_} = useLingui() const t = useTheme() const {link, params} = React.useMemo(() => { return { link: { title: linkProp.meta?.title ?? linkProp.uri, uri: linkProp.uri, description: linkProp.meta?.description ?? '', thumb: linkProp.localThumb?.path, }, params: parseEmbedPlayerFromUrl(linkProp.uri), } }, [linkProp]) const onPressSubmit = useCallback( (alt: string) => { control.close(() => { onSubmit(alt) }) }, [onSubmit, control], ) if (!gif || !params) return null const parsedAlt = parseAltFromGIFDescription(link.description) return ( <> {parsedAlt.isPreferred ? ( ) : ( )} ALT ) } function AltTextInner({ onSubmit, link, params, initialValue: initalValue, }: { onSubmit: (text: string) => void link: AppBskyEmbedExternal.ViewExternal params: EmbedPlayerParams initialValue: string }) { const {_} = useLingui() const [altText, setAltText] = useState(initalValue) const control = Dialog.useDialogContext() const onPressSubmit = useCallback(() => { onSubmit(altText) }, [onSubmit, altText]) return ( Descriptive alt text setAltText(enforceLen(text, MAX_ALT_TEXT)) } value={altText} multiline numberOfLines={3} autoFocus onKeyPress={({nativeEvent}) => { if (nativeEvent.key === 'Escape') { control.close() } }} /> {/* below the text input to force tab order */} Add alt text ) }