Something went wrong. Try again.
Bluesky app fork with some witchin' additions 💫 forked from jollywhoppers.com/witchsky.app
Something went wrong. Try again.
4.2 kB · 184 lines
TypeScript
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185import { type $Typed, type AppBskyFeedDefs, type AppBskyFeedPost, type AppBskyUnspeccedDefs, type AppBskyUnspeccedGetPostThreadV2, AtUri, moderatePost, type ModerationOpts,} from '@atproto/api'
import {makeProfileLink} from '#/lib/routes/links'import { type ApiThreadItem, type ThreadItem, type TraversalMetadata,} from '#/state/queries/usePostThread/types'
export function threadPostNoUnauthenticated({ uri, depth, value,}: ApiThreadItem): Extract<ThreadItem, {type: 'threadPostNoUnauthenticated'}> { return { type: 'threadPostNoUnauthenticated', key: uri, uri, depth, value: value as AppBskyUnspeccedDefs.ThreadItemNoUnauthenticated, // @ts-ignore populated by the traversal ui: {}, }}
export function threadPostNotFound({ uri, depth, value,}: ApiThreadItem): Extract<ThreadItem, {type: 'threadPostNotFound'}> { return { type: 'threadPostNotFound', key: uri, uri, depth, value: value as AppBskyUnspeccedDefs.ThreadItemNotFound, }}
export function threadPostBlocked({ uri, depth, value,}: ApiThreadItem): Extract<ThreadItem, {type: 'threadPostBlocked'}> { return { type: 'threadPostBlocked', key: uri, uri, depth, value: value as AppBskyUnspeccedDefs.ThreadItemBlocked, }}
export function threadPost({ uri, depth, value, moderationOpts, threadgateHiddenReplies,}: { uri: string depth: number value: $Typed<AppBskyUnspeccedDefs.ThreadItemPost> moderationOpts: ModerationOpts threadgateHiddenReplies: Set<string>}): Extract<ThreadItem, {type: 'threadPost'}> { const moderation = moderatePost(value.post, moderationOpts) const modui = moderation.ui('contentList') const blurred = modui.blur || modui.filter const muted = (modui.blurs[0] || modui.filters[0])?.type === 'muted' const hiddenByThreadgate = threadgateHiddenReplies.has(uri) const isOwnPost = value.post.author.did === moderationOpts.userDid const isBlurred = (hiddenByThreadgate || blurred || muted) && !isOwnPost return { type: 'threadPost', key: uri, uri, depth, value: { ...value, /* * Do not spread anything here, load bearing for post shadow strict * equality reference checks. */ post: value.post as Omit<AppBskyFeedDefs.PostView, 'record'> & { record: AppBskyFeedPost.Record }, }, isBlurred, moderation, // @ts-ignore populated by the traversal ui: {}, }}
export function readMore({ depth, repliesUnhydrated, skippedIndentIndices, postData,}: TraversalMetadata): Extract<ThreadItem, {type: 'readMore'}> { const urip = new AtUri(postData.uri) const href = makeProfileLink( { did: urip.host, handle: postData.authorHandle, }, 'post', urip.rkey, ) return { type: 'readMore' as const, key: `readMore:${postData.uri}`, href, moreReplies: repliesUnhydrated, depth, skippedIndentIndices, }}
export function readMoreUp({ postData,}: TraversalMetadata): Extract<ThreadItem, {type: 'readMoreUp'}> { const urip = new AtUri(postData.uri) const href = makeProfileLink( { did: urip.host, handle: postData.authorHandle, }, 'post', urip.rkey, ) return { type: 'readMoreUp' as const, key: `readMoreUp:${postData.uri}`, href, }}
export function skeleton({ key, item,}: Omit<Extract<ThreadItem, {type: 'skeleton'}>, 'type'>): Extract< ThreadItem, {type: 'skeleton'}> { return { type: 'skeleton', key, item, }}
export function postViewToThreadPlaceholder( post: AppBskyFeedDefs.PostView,): $Typed< Omit<AppBskyUnspeccedGetPostThreadV2.ThreadItem, 'value'> & { value: $Typed<AppBskyUnspeccedDefs.ThreadItemPost> }> { return { $type: 'app.bsky.unspecced.getPostThreadV2#threadItem', uri: post.uri, depth: 0, // reset to 0 for highlighted post value: { $type: 'app.bsky.unspecced.defs#threadItemPost', post, opThread: false, moreParents: false, moreReplies: 0, hiddenByThreadgate: false, mutedByViewer: false, }, }}