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