import React, {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 {isAndroid} from '#/platform/detection' import {Gif} from '#/state/queries/tenor' import {AltTextCounterWrapper} from '#/view/com/composer/AltTextCounterWrapper' import {atoms as a, native, useTheme} from '#/alf' import {Button, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' import {DialogControlProps} from '#/components/Dialog' import * as TextField from '#/components/forms/TextField' import {Check_Stroke2_Corner0_Rounded as Check} from '#/components/icons/Check' import {CircleInfo_Stroke2_Corner0_Rounded as CircleInfo} from '#/components/icons/CircleInfo' import {PlusSmall_Stroke2_Corner0_Rounded as Plus} from '#/components/icons/Plus' import {PortalComponent} from '#/components/Portal' import {Text} from '#/components/Typography' import {GifEmbed} from '../util/post-embeds/GifEmbed' import {AltTextReminder} from './photos/Gallery' export function GifAltText({ link: linkProp, gif, onSubmit, Portal, }: { link: ExternalEmbedDraft gif?: Gif onSubmit: (alt: string) => void Portal: PortalComponent }) { 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?.source.path, }, params: parseEmbedPlayerFromUrl(linkProp.uri), } }, [linkProp]) const parsedAlt = parseAltFromGIFDescription(link.description) const [altText, setAltText] = useState(parsedAlt.alt) if (!gif || !params) return null return ( <> {parsedAlt.isPreferred ? ( ) : ( )} ALT { onSubmit(altText) }} Portal={Portal}> ) } function AltTextInner({ altText, setAltText, control, link, params, }: { altText: string setAltText: (text: string) => void control: DialogControlProps link: AppBskyEmbedExternal.ViewExternal params: EmbedPlayerParams }) { const t = useTheme() const {_, i18n} = useLingui() return ( Descriptive alt text { setAltText(text) }} defaultValue={altText} multiline numberOfLines={3} autoFocus onKeyPress={({nativeEvent}) => { if (nativeEvent.key === 'Escape') { control.close() } }} /> {altText.length > MAX_ALT_TEXT && ( Alt text will be truncated. Limit:{' '} {i18n.number(MAX_ALT_TEXT)} characters. )} {/* below the text input to force tab order */} Add alt text {/* Maybe fix this later -h */} {isAndroid ? : null} ) }