diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/extractBskyMeta.ts | 99 | ||||
-rw-r--r-- | src/lib/link-meta.ts | 20 |
2 files changed, 104 insertions, 15 deletions
diff --git a/src/lib/extractBskyMeta.ts b/src/lib/extractBskyMeta.ts new file mode 100644 index 000000000..e53036aec --- /dev/null +++ b/src/lib/extractBskyMeta.ts @@ -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 +} diff --git a/src/lib/link-meta.ts b/src/lib/link-meta.ts index 49e75cde2..9a0325c8f 100644 --- a/src/lib/link-meta.ts +++ b/src/lib/link-meta.ts @@ -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 |