diff --git a/src/components/icons/X.tsx b/src/components/icons/X.tsx new file mode 100644 index 0000000000..101fab8157 --- /dev/null +++ b/src/components/icons/X.tsx @@ -0,0 +1 @@ +export {TimesLarge_Stroke2_Corner0_Rounded as X_Stroke2_Corner0_Rounded} from './Times' diff --git a/src/lib/link-meta/bsky.ts b/src/lib/link-meta/bsky.ts index e3b4ea0c9c..3d49f5237f 100644 --- a/src/lib/link-meta/bsky.ts +++ b/src/lib/link-meta/bsky.ts @@ -107,6 +107,11 @@ export async function extractBskyMeta( return meta } +export class EmbeddingDisabledError extends Error { + constructor() { + super('Embedding is disabled for this record') + } +} export async function getPostAsQuote( getPost: ReturnType, url: string, @@ -115,6 +120,9 @@ export async function getPostAsQuote( const [_0, user, _1, rkey] = url.split('/').filter(Boolean) const uri = makeRecordUri(user, 'app.bsky.feed.post', rkey) const post = await getPost({uri: uri}) + if (post.viewer?.embeddingDisabled) { + throw new EmbeddingDisabledError() + } return { uri: post.uri, cid: post.cid, diff --git a/src/view/com/composer/Composer.tsx b/src/view/com/composer/Composer.tsx index ef238752b4..e60d77706b 100644 --- a/src/view/com/composer/Composer.tsx +++ b/src/view/com/composer/Composer.tsx @@ -83,9 +83,12 @@ import {State as VideoUploadState} from 'state/queries/video/video' import {ComposerOpts} from 'state/shell/composer' import {ComposerReplyTo} from 'view/com/composer/ComposerReplyTo' import {atoms as a, useTheme} from '#/alf' -import {Button, ButtonText} from '#/components/Button' +import {Button, ButtonIcon, ButtonText} from '#/components/Button' +import {CircleInfo_Stroke2_Corner0_Rounded as CircleInfo} from '#/components/icons/CircleInfo' import {EmojiArc_Stroke2_Corner0_Rounded as EmojiSmile} from '#/components/icons/Emoji' +import {X_Stroke2_Corner0_Rounded as X} from '#/components/icons/X' import * as Prompt from '#/components/Prompt' +import {Text as NewText} from '#/components/Typography' import {QuoteEmbed, QuoteX} from '../util/post-embeds/QuoteEmbed' import {Text} from '../util/text/Text' import * as Toast from '../util/Toast' @@ -183,7 +186,7 @@ export const ComposePost = observer(function ComposePost({ }) const [publishOnUpload, setPublishOnUpload] = useState(false) - const {extLink, setExtLink} = useExternalLinkFetch({setQuote}) + const {extLink, setExtLink} = useExternalLinkFetch({setQuote, setError}) const [extGif, setExtGif] = useState() const [labels, setLabels] = useState([]) const [threadgateAllowUISettings, onChangeThreadgateAllowUISettings] = @@ -572,15 +575,40 @@ export const ComposePost = observer(function ComposePost({ )} {error !== '' && ( - - - + + + + + {error} + + - {error} )} diff --git a/src/view/com/composer/useExternalLinkFetch.ts b/src/view/com/composer/useExternalLinkFetch.ts index 2938ea25ac..3175144372 100644 --- a/src/view/com/composer/useExternalLinkFetch.ts +++ b/src/view/com/composer/useExternalLinkFetch.ts @@ -1,4 +1,6 @@ import {useEffect, useState} from 'react' +import {msg} from '@lingui/macro' +import {useLingui} from '@lingui/react' import {logger} from '#/logger' import {useFetchDid} from '#/state/queries/handle' @@ -7,6 +9,7 @@ import {useAgent} from '#/state/session' import * as apilib from 'lib/api/index' import {POST_IMG_MAX} from 'lib/constants' import { + EmbeddingDisabledError, getFeedAsEmbed, getListAsEmbed, getPostAsQuote, @@ -28,9 +31,12 @@ import {ComposerOpts} from 'state/shell/composer' export function useExternalLinkFetch({ setQuote, + setError, }: { setQuote: (opts: ComposerOpts['quote']) => void + setError: (err: string) => void }) { + const {_} = useLingui() const [extLink, setExtLink] = useState( undefined, ) @@ -57,9 +63,13 @@ export function useExternalLinkFetch({ setExtLink(undefined) }, err => { - logger.error('Failed to fetch post for quote embedding', { - message: err.toString(), - }) + if (err instanceof EmbeddingDisabledError) { + setError(_(msg`This post's author has disabled quote posts.`)) + } else { + logger.error('Failed to fetch post for quote embedding', { + message: err.toString(), + }) + } setExtLink(undefined) }, ) @@ -170,7 +180,7 @@ export function useExternalLinkFetch({ }) } return cleanup - }, [extLink, setQuote, getPost, fetchDid, agent]) + }, [_, extLink, setQuote, getPost, fetchDid, agent, setError]) return {extLink, setExtLink} }