mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1import {LRUMap} from 'lru_map'
2import {RootStoreModel} from '../root-store'
3import {
4 AppBskyFeedDefs,
5 AppBskyEmbedRecord,
6 AppBskyEmbedRecordWithMedia,
7 AppBskyFeedPost,
8} from '@atproto/api'
9
10type PostView = AppBskyFeedDefs.PostView
11
12export class PostsCache {
13 cache: LRUMap<string, PostView> = new LRUMap(500)
14
15 constructor(public rootStore: RootStoreModel) {}
16
17 set(uri: string, postView: PostView) {
18 this.cache.set(uri, postView)
19 if (postView.author.handle) {
20 this.rootStore.handleResolutions.cache.set(
21 postView.author.handle,
22 postView.author.did,
23 )
24 }
25 }
26
27 fromFeedItem(feedItem: AppBskyFeedDefs.FeedViewPost) {
28 this.set(feedItem.post.uri, feedItem.post)
29 if (
30 feedItem.reply?.parent &&
31 AppBskyFeedDefs.isPostView(feedItem.reply?.parent)
32 ) {
33 this.set(feedItem.reply.parent.uri, feedItem.reply.parent)
34 }
35 const embed = feedItem.post.embed
36 if (
37 AppBskyEmbedRecord.isView(embed) &&
38 AppBskyEmbedRecord.isViewRecord(embed.record) &&
39 AppBskyFeedPost.isRecord(embed.record.value) &&
40 AppBskyFeedPost.validateRecord(embed.record.value).success
41 ) {
42 this.set(embed.record.uri, embedViewToPostView(embed.record))
43 }
44 if (
45 AppBskyEmbedRecordWithMedia.isView(embed) &&
46 AppBskyEmbedRecord.isViewRecord(embed.record?.record) &&
47 AppBskyFeedPost.isRecord(embed.record.record.value) &&
48 AppBskyFeedPost.validateRecord(embed.record.record.value).success
49 ) {
50 this.set(
51 embed.record.record.uri,
52 embedViewToPostView(embed.record.record),
53 )
54 }
55 }
56}
57
58function embedViewToPostView(
59 embedView: AppBskyEmbedRecord.ViewRecord,
60): PostView {
61 return {
62 $type: 'app.bsky.feed.post#view',
63 uri: embedView.uri,
64 cid: embedView.cid,
65 author: embedView.author,
66 record: embedView.value,
67 indexedAt: embedView.indexedAt,
68 labels: embedView.labels,
69 }
70}