Add starter pack embeds to posts (#4699)
* starter pack embeds * revert test code * Types * add `BaseLink` * precache on click * rm log * add a comment * loading state * top margin --------- Co-authored-by: Dan Abramov <dan.abramov@gmail.com>
This commit is contained in:
parent
a3d4fb652b
commit
aa7117edb6
10 changed files with 246 additions and 41 deletions
|
@ -1,11 +1,16 @@
|
|||
import {AppBskyFeedPost, BskyAgent} from '@atproto/api'
|
||||
import {AppBskyFeedPost, AppBskyGraphStarterpack, BskyAgent} from '@atproto/api'
|
||||
|
||||
import {useFetchDid} from '#/state/queries/handle'
|
||||
import {useGetPost} from '#/state/queries/post'
|
||||
import * as apilib from 'lib/api/index'
|
||||
import {LikelyType, LinkMeta} from './link-meta'
|
||||
import {
|
||||
createStarterPackUri,
|
||||
parseStarterPackUri,
|
||||
} from 'lib/strings/starter-pack'
|
||||
import {ComposerOptsQuote} from 'state/shell/composer'
|
||||
// import {match as matchRoute} from 'view/routes'
|
||||
import {convertBskyAppUrlIfNeeded, makeRecordUri} from '../strings/url-helpers'
|
||||
import {ComposerOptsQuote} from 'state/shell/composer'
|
||||
import {useGetPost} from '#/state/queries/post'
|
||||
import {useFetchDid} from '#/state/queries/handle'
|
||||
import {LikelyType, LinkMeta} from './link-meta'
|
||||
|
||||
// TODO
|
||||
// import {Home} from 'view/screens/Home'
|
||||
|
@ -174,3 +179,39 @@ export async function getListAsEmbed(
|
|||
},
|
||||
}
|
||||
}
|
||||
|
||||
export async function getStarterPackAsEmbed(
|
||||
agent: BskyAgent,
|
||||
fetchDid: ReturnType<typeof useFetchDid>,
|
||||
url: string,
|
||||
): Promise<apilib.ExternalEmbedDraft> {
|
||||
const parsed = parseStarterPackUri(url)
|
||||
if (!parsed) {
|
||||
throw new Error(
|
||||
'Unexepectedly called getStarterPackAsEmbed with a non-starterpack url',
|
||||
)
|
||||
}
|
||||
const did = await fetchDid(parsed.name)
|
||||
const starterPack = createStarterPackUri({did, rkey: parsed.rkey})
|
||||
const res = await agent.app.bsky.graph.getStarterPack({starterPack})
|
||||
const record = res.data.starterPack.record
|
||||
return {
|
||||
isLoading: false,
|
||||
uri: starterPack,
|
||||
meta: {
|
||||
url: starterPack,
|
||||
likelyType: LikelyType.AtpData,
|
||||
// Validation here should never fail
|
||||
title: AppBskyGraphStarterpack.isRecord(record)
|
||||
? record.name
|
||||
: 'Starter Pack',
|
||||
},
|
||||
embed: {
|
||||
$type: 'app.bsky.embed.record',
|
||||
record: {
|
||||
uri: res.data.starterPack.uri,
|
||||
cid: res.data.starterPack.cid,
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
|
@ -96,7 +96,7 @@ export function createStarterPackUri({
|
|||
}: {
|
||||
did: string
|
||||
rkey: string
|
||||
}): string | null {
|
||||
}): string {
|
||||
return new AtUri(`at://${did}/app.bsky.graph.starterpack/${rkey}`).toString()
|
||||
}
|
||||
|
||||
|
|
|
@ -152,6 +152,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\/(?<name>[^/]+)\/(?<rkey>[^/]+)/i.test(urlp.pathname)
|
||||
} catch {
|
||||
console.error('Unexpected error in isBskyStartUrl()', url)
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
export function isBskyStarterPackUrl(url: string): boolean {
|
||||
if (isBskyAppUrl(url)) {
|
||||
try {
|
||||
const urlp = new URL(url)
|
||||
return /starter-pack\/(?<name>[^/]+)\/(?<rkey>[^/]+)/i.test(urlp.pathname)
|
||||
} catch {
|
||||
console.error('Unexpected error in isBskyStartUrl()', url)
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
export function isBskyDownloadUrl(url: string): boolean {
|
||||
if (isExternalUrl(url)) {
|
||||
return false
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue