38 lines
1.1 KiB
TypeScript
38 lines
1.1 KiB
TypeScript
import {AppBskyFeedDefs, AppBskyFeedThreadgate} from '@atproto/api'
|
|
|
|
export type ThreadgateSetting =
|
|
| {type: 'nobody'}
|
|
| {type: 'mention'}
|
|
| {type: 'following'}
|
|
| {type: 'list'; list: unknown}
|
|
|
|
export function threadgateViewToSettings(
|
|
threadgate: AppBskyFeedDefs.ThreadgateView | undefined,
|
|
): ThreadgateSetting[] {
|
|
const record =
|
|
threadgate &&
|
|
AppBskyFeedThreadgate.isRecord(threadgate.record) &&
|
|
AppBskyFeedThreadgate.validateRecord(threadgate.record).success
|
|
? threadgate.record
|
|
: null
|
|
if (!record) {
|
|
return []
|
|
}
|
|
if (!record.allow?.length) {
|
|
return [{type: 'nobody'}]
|
|
}
|
|
const settings: ThreadgateSetting[] = record.allow
|
|
.map(allow => {
|
|
let setting: ThreadgateSetting | undefined
|
|
if (allow.$type === 'app.bsky.feed.threadgate#mentionRule') {
|
|
setting = {type: 'mention'}
|
|
} else if (allow.$type === 'app.bsky.feed.threadgate#followingRule') {
|
|
setting = {type: 'following'}
|
|
} else if (allow.$type === 'app.bsky.feed.threadgate#listRule') {
|
|
setting = {type: 'list', list: allow.list}
|
|
}
|
|
return setting
|
|
})
|
|
.filter(n => !!n)
|
|
return settings
|
|
}
|