From 1d6c3fd5c2858ef55b284fb94e1a287ba158bc06 Mon Sep 17 00:00:00 2001 From: Hailey Date: Wed, 26 Jun 2024 14:09:17 -0700 Subject: [PATCH] better sp embed --- src/lib/link-meta/link-meta.ts | 11 ++- src/lib/strings/starter-pack.ts | 7 ++ src/lib/strings/url-helpers.ts | 24 ++++++ .../util/post-embeds/ExternalLinkEmbed.tsx | 78 ++++++++++++------- 4 files changed, 87 insertions(+), 33 deletions(-) diff --git a/src/lib/link-meta/link-meta.ts b/src/lib/link-meta/link-meta.ts index fa951432e8..8c3a733103 100644 --- a/src/lib/link-meta/link-meta.ts +++ b/src/lib/link-meta/link-meta.ts @@ -1,8 +1,13 @@ import {BskyAgent} from '@atproto/api' -import {isBskyAppUrl} from '../strings/url-helpers' -import {extractBskyMeta} from './bsky' + import {LINK_META_PROXY} from 'lib/constants' import {getGiphyMetaUri} from 'lib/strings/embed-player' +import { + isBskyAppUrl, + isBskyStarterPackUrl, + isBskyStartUrl, +} from '../strings/url-helpers' +import {extractBskyMeta} from './bsky' export enum LikelyType { HTML, @@ -28,7 +33,7 @@ export async function getLinkMeta( url: string, timeout = 15e3, ): Promise { - if (isBskyAppUrl(url)) { + if (isBskyAppUrl(url) && !isBskyStartUrl(url) && !isBskyStarterPackUrl(url)) { return extractBskyMeta(agent, url) } diff --git a/src/lib/strings/starter-pack.ts b/src/lib/strings/starter-pack.ts index 489d0b9231..52f04707b0 100644 --- a/src/lib/strings/starter-pack.ts +++ b/src/lib/strings/starter-pack.ts @@ -83,6 +83,13 @@ export function getStarterPackOgCard( rkey?: string, ) { if (typeof didOrStarterPack === 'string') { + // Used for link embeds so that we always keep the image up to date rather than using the uploaded one. + if (didOrStarterPack.startsWith('https://')) { + const parsed = parseStarterPackUri(didOrStarterPack) + if (!parsed) return null + return getStarterPackOgCard(parsed?.name, parsed?.rkey) + } + return `https://ogcard.cdn.bsky.app/start/${didOrStarterPack}/${rkey}` } else { const rkey = new AtUri(didOrStarterPack.uri).rkey diff --git a/src/lib/strings/url-helpers.ts b/src/lib/strings/url-helpers.ts index 4c75f47add..320c0319d7 100644 --- a/src/lib/strings/url-helpers.ts +++ b/src/lib/strings/url-helpers.ts @@ -151,6 +151,30 @@ export function isBskyListUrl(url: string): boolean { return false } +export function isBskyStartUrl(url: string): boolean { + if (isBskyAppUrl(url)) { + try { + const urlp = new URL(url) + return /start\/(?[^/]+)\/(?[^/]+)/i.test(urlp.pathname) + } catch { + console.error('Unexpected error in isBskyListUrl()', url) + } + } + return false +} + +export function isBskyStarterPackUrl(url: string): boolean { + if (isBskyAppUrl(url)) { + try { + const urlp = new URL(url) + return /starter-pack\/(?[^/]+)\/(?[^/]+)/i.test(urlp.pathname) + } catch { + console.error('Unexpected error in isBskyListUrl()', url) + } + } + return false +} + export function isBskyDownloadUrl(url: string): boolean { if (isExternalUrl(url)) { return false diff --git a/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx b/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx index 3b2a12c24b..cfa8493d80 100644 --- a/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx +++ b/src/view/com/util/post-embeds/ExternalLinkEmbed.tsx @@ -2,12 +2,19 @@ import React, {useCallback} from 'react' import {StyleProp, View, ViewStyle} from 'react-native' import {Image} from 'expo-image' import {AppBskyEmbedExternal} from '@atproto/api' +import {msg} from '@lingui/macro' +import {useLingui} from '@lingui/react' import {usePalette} from 'lib/hooks/usePalette' import {useWebMediaQueries} from 'lib/hooks/useWebMediaQueries' import {shareUrl} from 'lib/sharing' import {parseEmbedPlayerFromUrl} from 'lib/strings/embed-player' -import {toNiceDomain} from 'lib/strings/url-helpers' +import {getStarterPackOgCard} from 'lib/strings/starter-pack' +import { + isBskyStarterPackUrl, + isBskyStartUrl, + toNiceDomain, +} from 'lib/strings/url-helpers' import {isNative} from 'platform/detection' import {useExternalEmbedsPrefs} from 'state/preferences' import {Link} from 'view/com/util/Link' @@ -28,10 +35,15 @@ export const ExternalLinkEmbed = ({ style?: StyleProp hideAlt?: boolean }) => { + const {_} = useLingui() const pal = usePalette('default') const {isMobile} = useWebMediaQueries() const externalEmbedPrefs = useExternalEmbedsPrefs() + const isStarterPack = + isBskyStartUrl(link.uri) || isBskyStarterPackUrl(link.uri) + const imageUri = isStarterPack ? getStarterPackOgCard(link.uri) : link.thumb + const embedPlayerParams = React.useMemo(() => { const params = parseEmbedPlayerFromUrl(link.uri) @@ -47,15 +59,19 @@ export const ExternalLinkEmbed = ({ return ( - {link.thumb && !embedPlayerParams ? ( + {imageUri && !embedPlayerParams ? ( ) : undefined} {embedPlayerParams?.isGif ? ( @@ -63,35 +79,37 @@ export const ExternalLinkEmbed = ({ ) : embedPlayerParams ? ( ) : undefined} - - - {toNiceDomain(link.uri)} - - - {!embedPlayerParams?.isGif && !embedPlayerParams?.dimensions && ( - - {link.title || link.uri} - - )} - {link.description ? ( + {!isStarterPack ? ( + - {link.description} + type="sm" + numberOfLines={1} + style={[pal.textLight, {marginVertical: 2}]}> + {toNiceDomain(link.uri)} - ) : undefined} - + + {!embedPlayerParams?.isGif && !embedPlayerParams?.dimensions && ( + + {link.title || link.uri} + + )} + {link.description ? ( + + {link.description} + + ) : undefined} + + ) : null} )