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}