mirror of https://git.lenooby09.tech/LeNooby09/social-app.git
1/**
2 * This file is a copy of what exists in the social-app
3 */
4
5import {
6 AppBskyEmbedExternal,
7 AppBskyEmbedImages,
8 AppBskyEmbedRecord,
9 AppBskyEmbedRecordWithMedia,
10 AppBskyEmbedVideo,
11 AppBskyFeedDefs,
12 AppBskyGraphDefs,
13 AppBskyLabelerDefs,
14} from '@atproto/api'
15
16export type Embed =
17 | {
18 type: 'post'
19 view: AppBskyEmbedRecord.ViewRecord
20 }
21 | {
22 type: 'post_not_found'
23 view: AppBskyEmbedRecord.ViewNotFound
24 }
25 | {
26 type: 'post_blocked'
27 view: AppBskyEmbedRecord.ViewBlocked
28 }
29 | {
30 type: 'post_detached'
31 view: AppBskyEmbedRecord.ViewDetached
32 }
33 | {
34 type: 'feed'
35 view: AppBskyFeedDefs.GeneratorView
36 }
37 | {
38 type: 'list'
39 view: AppBskyGraphDefs.ListView
40 }
41 | {
42 type: 'labeler'
43 view: AppBskyLabelerDefs.LabelerView
44 }
45 | {
46 type: 'starter_pack'
47 view: AppBskyGraphDefs.StarterPackViewBasic
48 }
49 | {
50 type: 'images'
51 view: AppBskyEmbedImages.View
52 }
53 | {
54 type: 'link'
55 view: AppBskyEmbedExternal.View
56 }
57 | {
58 type: 'video'
59 view: AppBskyEmbedVideo.View
60 }
61 | {
62 type: 'post_with_media'
63 view: Embed
64 media: Embed
65 }
66 | {
67 type: 'unknown'
68 view: null
69 }
70
71export type EmbedType<T extends Embed['type']> = Extract<Embed, {type: T}>
72
73export function parseEmbedRecordView({record}: AppBskyEmbedRecord.View): Embed {
74 if (AppBskyEmbedRecord.isViewRecord(record)) {
75 return {
76 type: 'post',
77 view: record,
78 }
79 } else if (AppBskyEmbedRecord.isViewNotFound(record)) {
80 return {
81 type: 'post_not_found',
82 view: record,
83 }
84 } else if (AppBskyEmbedRecord.isViewBlocked(record)) {
85 return {
86 type: 'post_blocked',
87 view: record,
88 }
89 } else if (AppBskyEmbedRecord.isViewDetached(record)) {
90 return {
91 type: 'post_detached',
92 view: record,
93 }
94 } else if (AppBskyFeedDefs.isGeneratorView(record)) {
95 return {
96 type: 'feed',
97 view: record,
98 }
99 } else if (AppBskyGraphDefs.isListView(record)) {
100 return {
101 type: 'list',
102 view: record,
103 }
104 } else if (AppBskyLabelerDefs.isLabelerView(record)) {
105 return {
106 type: 'labeler',
107 view: record,
108 }
109 } else if (AppBskyGraphDefs.isStarterPackViewBasic(record)) {
110 return {
111 type: 'starter_pack',
112 view: record,
113 }
114 } else {
115 return {
116 type: 'unknown',
117 view: null,
118 }
119 }
120}
121
122export function parseEmbed(embed: AppBskyFeedDefs.PostView['embed']): Embed {
123 if (AppBskyEmbedImages.isView(embed)) {
124 return {
125 type: 'images',
126 view: embed,
127 }
128 } else if (AppBskyEmbedExternal.isView(embed)) {
129 return {
130 type: 'link',
131 view: embed,
132 }
133 } else if (AppBskyEmbedVideo.isView(embed)) {
134 return {
135 type: 'video',
136 view: embed,
137 }
138 } else if (AppBskyEmbedRecord.isView(embed)) {
139 return parseEmbedRecordView(embed)
140 } else if (AppBskyEmbedRecordWithMedia.isView(embed)) {
141 return {
142 type: 'post_with_media',
143 view: parseEmbedRecordView(embed.record),
144 media: parseEmbed(embed.media),
145 }
146 } else {
147 return {
148 type: 'unknown',
149 view: null,
150 }
151 }
152}