Improve link meta fetching for bsky links (#54)
* Add share dropdown item to profiles * Temporary improvement for links to content on the network * Enlarge text slightly on embed cards
This commit is contained in:
parent
0536a6afcf
commit
9230d52ff5
8 changed files with 123 additions and 23 deletions
99
src/lib/extractBskyMeta.ts
Normal file
99
src/lib/extractBskyMeta.ts
Normal file
|
@ -0,0 +1,99 @@
|
|||
import {LikelyType, LinkMeta} from './link-meta'
|
||||
import {match as matchRoute} from '../view/routes'
|
||||
import {convertBskyAppUrlIfNeeded, makeRecordUri} from './strings'
|
||||
import {RootStoreModel} from '../state'
|
||||
import {PostThreadViewModel} from '../state/models/post-thread-view'
|
||||
|
||||
import {Home} from '../view/screens/Home'
|
||||
import {Search} from '../view/screens/Search'
|
||||
import {Notifications} from '../view/screens/Notifications'
|
||||
import {PostThread} from '../view/screens/PostThread'
|
||||
import {PostUpvotedBy} from '../view/screens/PostUpvotedBy'
|
||||
import {PostRepostedBy} from '../view/screens/PostRepostedBy'
|
||||
import {Profile} from '../view/screens/Profile'
|
||||
import {ProfileFollowers} from '../view/screens/ProfileFollowers'
|
||||
import {ProfileFollows} from '../view/screens/ProfileFollows'
|
||||
|
||||
// NOTE
|
||||
// this is a hack around the lack of hosted social metadata
|
||||
// remove once that's implemented
|
||||
// -prf
|
||||
export async function extractBskyMeta(
|
||||
store: RootStoreModel,
|
||||
url: string,
|
||||
): Promise<LinkMeta> {
|
||||
url = convertBskyAppUrlIfNeeded(url)
|
||||
const route = matchRoute(url)
|
||||
let meta: LinkMeta = {
|
||||
likelyType: LikelyType.AtpData,
|
||||
url,
|
||||
title: route.defaultTitle,
|
||||
}
|
||||
|
||||
if (route.Com === Home) {
|
||||
meta = {
|
||||
...meta,
|
||||
title: 'Bluesky',
|
||||
description: 'A new kind of social network',
|
||||
}
|
||||
} else if (route.Com === Search) {
|
||||
meta = {
|
||||
...meta,
|
||||
title: 'Search - Bluesky',
|
||||
description: 'A new kind of social network',
|
||||
}
|
||||
} else if (route.Com === Notifications) {
|
||||
meta = {
|
||||
...meta,
|
||||
title: 'Notifications - Bluesky',
|
||||
description: 'A new kind of social network',
|
||||
}
|
||||
} else if (
|
||||
route.Com === PostThread ||
|
||||
route.Com === PostUpvotedBy ||
|
||||
route.Com === PostRepostedBy
|
||||
) {
|
||||
// post and post-related screens
|
||||
const threadUri = makeRecordUri(
|
||||
route.params.name,
|
||||
'app.bsky.feed.post',
|
||||
route.params.rkey,
|
||||
)
|
||||
const threadView = new PostThreadViewModel(store, {
|
||||
uri: threadUri,
|
||||
depth: 0,
|
||||
})
|
||||
await threadView.setup().catch(_err => undefined)
|
||||
const title = [
|
||||
route.Com === PostUpvotedBy
|
||||
? 'Likes on a post by'
|
||||
: route.Com === PostRepostedBy
|
||||
? 'Reposts of a post by'
|
||||
: 'Post by',
|
||||
threadView.thread?.post.author.displayName ||
|
||||
threadView.thread?.post.author.handle ||
|
||||
'a bluesky user',
|
||||
].join(' ')
|
||||
meta = {
|
||||
...meta,
|
||||
title,
|
||||
description: threadView.thread?.postRecord?.text,
|
||||
}
|
||||
} else if (
|
||||
route.Com === Profile ||
|
||||
route.Com === ProfileFollowers ||
|
||||
route.Com === ProfileFollows
|
||||
) {
|
||||
// profile and profile-related screens
|
||||
const profile = await store.profiles.getProfile(route.params.name)
|
||||
if (profile?.data) {
|
||||
meta = {
|
||||
...meta,
|
||||
title: profile.data.displayName || profile.data.handle,
|
||||
description: profile.data.description,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return meta
|
||||
}
|
|
@ -1,10 +1,7 @@
|
|||
import he from 'he'
|
||||
import {
|
||||
extractHtmlMeta,
|
||||
isBskyAppUrl,
|
||||
convertBskyAppUrlIfNeeded,
|
||||
} from './strings'
|
||||
import {match as matchRoute} from '../view/routes'
|
||||
import {extractHtmlMeta, isBskyAppUrl} from './strings'
|
||||
import {RootStoreModel} from '../state'
|
||||
import {extractBskyMeta} from './extractBskyMeta'
|
||||
|
||||
export enum LikelyType {
|
||||
HTML,
|
||||
|
@ -26,19 +23,12 @@ export interface LinkMeta {
|
|||
}
|
||||
|
||||
export async function getLinkMeta(
|
||||
store: RootStoreModel,
|
||||
url: string,
|
||||
timeout = 5e3,
|
||||
): Promise<LinkMeta> {
|
||||
if (isBskyAppUrl(url)) {
|
||||
// TODO this could be better
|
||||
url = convertBskyAppUrlIfNeeded(url)
|
||||
const route = matchRoute(url)
|
||||
return {
|
||||
likelyType: LikelyType.AtpData,
|
||||
url,
|
||||
title: route.defaultTitle,
|
||||
// description: ''
|
||||
}
|
||||
return extractBskyMeta(store, url)
|
||||
}
|
||||
|
||||
let urlp
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue