diff options
-rw-r--r-- | __tests__/lib/string.test.ts | 16 | ||||
-rw-r--r-- | src/components/dialogs/GifSelect.tsx | 9 | ||||
-rw-r--r-- | src/state/queries/tenor.ts | 13 |
3 files changed, 34 insertions, 4 deletions
diff --git a/__tests__/lib/string.test.ts b/__tests__/lib/string.test.ts index b018da236..0f53d386a 100644 --- a/__tests__/lib/string.test.ts +++ b/__tests__/lib/string.test.ts @@ -6,6 +6,7 @@ import { createStarterPackLinkFromAndroidReferrer, parseStarterPackUri, } from '#/lib/strings/starter-pack' +import {tenorUrlToBskyGifUrl} from '#/state/queries/tenor' import {cleanError} from '../../src/lib/strings/errors' import {createFullHandle, makeValidHandle} from '../../src/lib/strings/handles' import {enforceLen} from '../../src/lib/strings/helpers' @@ -997,3 +998,18 @@ describe('createStarterPackGooglePlayUri', () => { expect(createStarterPackGooglePlayUri(undefined, 'rkey')).toEqual(null) }) }) + +describe('tenorUrlToBskyGifUrl', () => { + const inputs = [ + 'https://media.tenor.com/someID_AAAAC/someName.gif', + 'https://media.tenor.com/someID/someName.gif', + ] + + it.each(inputs)( + 'returns url with t.gifs.bsky.app as hostname for input url', + input => { + const out = tenorUrlToBskyGifUrl(input) + expect(out.startsWith('https://t.gifs.bsky.app/')).toEqual(true) + }, + ) +}) diff --git a/src/components/dialogs/GifSelect.tsx b/src/components/dialogs/GifSelect.tsx index 8ced355e4..e18fdf2db 100644 --- a/src/components/dialogs/GifSelect.tsx +++ b/src/components/dialogs/GifSelect.tsx @@ -5,7 +5,7 @@ import React, { useRef, useState, } from 'react' -import {TextInput, View} from 'react-native' +import {type TextInput, View} from 'react-native' import {useWindowDimensions} from 'react-native' import {Image} from 'expo-image' import {msg, Trans} from '@lingui/macro' @@ -15,13 +15,14 @@ import {logEvent} from '#/lib/statsig/statsig' import {cleanError} from '#/lib/strings/errors' import {isWeb} from '#/platform/detection' import { - Gif, + type Gif, + tenorUrlToBskyGifUrl, useFeaturedGifsQuery, useGifSearchQuery, } from '#/state/queries/tenor' import {ErrorScreen} from '#/view/com/util/error/ErrorScreen' import {ErrorBoundary} from '#/view/com/util/ErrorBoundary' -import {ListMethods} from '#/view/com/util/List' +import {type ListMethods} from '#/view/com/util/List' import {atoms as a, ios, native, useBreakpoints, useTheme, web} from '#/alf' import {Button, ButtonIcon, ButtonText} from '#/components/Button' import * as Dialog from '#/components/Dialog' @@ -316,7 +317,7 @@ export function GifPreview({ t.atoms.bg_contrast_25, ]} source={{ - uri: gif.media_formats.tinygif.url, + uri: tenorUrlToBskyGifUrl(gif.media_formats.tinygif.url), }} contentFit="cover" accessibilityLabel={gif.title} diff --git a/src/state/queries/tenor.ts b/src/state/queries/tenor.ts index 80c57479e..3379d5dfb 100644 --- a/src/state/queries/tenor.ts +++ b/src/state/queries/tenor.ts @@ -3,6 +3,7 @@ import {getLocales} from 'expo-localization' import {keepPreviousData, useInfiniteQuery} from '@tanstack/react-query' import {GIF_FEATURED, GIF_SEARCH} from '#/lib/constants' +import {logger} from '#/logger' export const RQKEY_ROOT = 'gif-service' export const RQKEY_FEATURED = [RQKEY_ROOT, 'featured'] @@ -86,6 +87,18 @@ function createTenorApi<Input extends object>( } } +export function tenorUrlToBskyGifUrl(tenorUrl: string) { + let url + try { + url = new URL(tenorUrl) + } catch (e) { + logger.debug('invalid url passed to tenorUrlToBskyGifUrl()') + return '' + } + url.hostname = 't.gifs.bsky.app' + return url.href +} + export type Gif = { /** * A Unix timestamp that represents when this post was created. |