diff --git a/src/state/queries/postgate/util.ts b/src/state/queries/postgate/util.ts index a60d5c5f95..d4f684bf51 100644 --- a/src/state/queries/postgate/util.ts +++ b/src/state/queries/postgate/util.ts @@ -3,6 +3,7 @@ import { AppBskyEmbedRecordWithMedia, AppBskyFeedDefs, AppBskyFeedPostgate, + AtUri, } from '@atproto/api' import {ViewRemoved} from '@atproto/api/dist/client/types/app/bsky/embed/record' @@ -104,3 +105,57 @@ export function createEmbedRecordWithmediaView({ }, } } + +export function getMaybeDetachedQuoteEmbed({ + viewerDid, + post, +}: { + viewerDid: string + post: AppBskyFeedDefs.PostView +}) { + if (AppBskyEmbedRecord.isView(post.embed)) { + // detached + if (AppBskyEmbedRecord.isViewRemoved(post.embed.record)) { + const urip = new AtUri(post.embed.record.uri) + return { + embed: post.embed, + uri: urip.toString(), + isOwnedByViewer: urip.host === viewerDid, + isDetached: true, + } + } + + // post + if (AppBskyEmbedRecord.isViewRecord(post.embed.record)) { + const urip = new AtUri(post.embed.record.uri) + return { + embed: post.embed, + uri: urip.toString(), + isOwnedByViewer: urip.host === viewerDid, + isDetached: false, + } + } + } else if (AppBskyEmbedRecordWithMedia.isView(post.embed)) { + // detached + if (AppBskyEmbedRecord.isViewRemoved(post.embed.record.record)) { + const urip = new AtUri(post.embed.record.record.uri) + return { + embed: post.embed, + uri: urip.toString(), + isOwnedByViewer: urip.host === viewerDid, + isDetached: true, + } + } + + // post + if (AppBskyEmbedRecord.isViewRecord(post.embed.record.record)) { + const urip = new AtUri(post.embed.record.record.uri) + return { + embed: post.embed, + uri: urip.toString(), + isOwnedByViewer: urip.host === viewerDid, + isDetached: false, + } + } + } +} diff --git a/src/view/com/util/forms/PostDropdownBtn.tsx b/src/view/com/util/forms/PostDropdownBtn.tsx index bbba1a66aa..34e70b462f 100644 --- a/src/view/com/util/forms/PostDropdownBtn.tsx +++ b/src/view/com/util/forms/PostDropdownBtn.tsx @@ -7,8 +7,6 @@ import { } from 'react-native' import * as Clipboard from 'expo-clipboard' import { - AppBskyEmbedRecord, - AppBskyEmbedRecordWithMedia, AppBskyFeedDefs, AppBskyFeedPost, AtUri, @@ -34,6 +32,7 @@ import { useThreadMuteMutationQueue, } from '#/state/queries/post' import {useToggleQuoteDetachmentMutation} from '#/state/queries/postgate' +import {getMaybeDetachedQuoteEmbed} from '#/state/queries/postgate/util' import {useToggleReplyVisibilityMutation} from '#/state/queries/threadgate' import {useThreadgateRecordQuery} from '#/state/queries/threadgate' import {useSession} from '#/state/session' @@ -118,38 +117,11 @@ let PostDropdownBtn = ({ const postCid = post.cid const postAuthor = post.author const quoteEmbed = React.useMemo(() => { - if (!currentAccount) return - if (!post.embed) return - - if (AppBskyEmbedRecord.isView(post.embed)) { - const isPost = AppBskyEmbedRecord.isViewRecord(post.embed.record) - const isDetachedPost = AppBskyEmbedRecord.isViewRemoved(post.embed.record) - - if (isPost || isDetachedPost) { - const urip = new AtUri(post.embed.record.uri) - - return { - uri: urip.toString(), - isOwnedByViewer: urip.host === currentAccount.did, - isDetached: isDetachedPost, - } - } - } else if (AppBskyEmbedRecordWithMedia.isView(post.embed)) { - const isPost = AppBskyEmbedRecord.isViewRecord(post.embed.record.record) - const isDetachedPost = AppBskyEmbedRecord.isViewRemoved( - post.embed.record.record, - ) - - if (isPost || isDetachedPost) { - const urip = new AtUri(post.embed.record.record.uri) - - return { - uri: urip.toString(), - isOwnedByViewer: urip.host === currentAccount.did, - isDetached: isDetachedPost, - } - } - } + if (!currentAccount || !post.embed) return + return getMaybeDetachedQuoteEmbed({ + viewerDid: currentAccount?.did, + post, + }) }, [post, currentAccount]) const rootUri = record.reply?.root?.uri || postUri