diff options
Diffstat (limited to 'src/state/models/feeds/algo/algo-item.ts')
-rw-r--r-- | src/state/models/feeds/algo/algo-item.ts | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/src/state/models/feeds/algo/algo-item.ts b/src/state/models/feeds/algo/algo-item.ts new file mode 100644 index 000000000..bd4ea4fd6 --- /dev/null +++ b/src/state/models/feeds/algo/algo-item.ts @@ -0,0 +1,142 @@ +import {AppBskyFeedDefs, AtUri} from '@atproto/api' +import {makeAutoObservable} from 'mobx' +import {RootStoreModel} from 'state/models/root-store' + +export class AlgoItemModel { + // data + data: AppBskyFeedDefs.GeneratorView + + constructor( + public rootStore: RootStoreModel, + view: AppBskyFeedDefs.GeneratorView, + ) { + this.data = view + makeAutoObservable( + this, + { + rootStore: false, + }, + {autoBind: true}, + ) + } + + // local actions + // = + set toggleSaved(value: boolean) { + console.log('toggleSaved', this.data.viewer) + if (this.data.viewer) { + this.data.viewer.saved = value + } + } + + get getUri() { + return this.data.uri + } + + get isSaved() { + return this.data.viewer?.saved + } + + get isLiked() { + return this.data.viewer?.like + } + + private toggleLiked(s?: string) { + if (this.data.viewer) { + if (this.data.viewer.like) { + this.data.viewer.like = undefined + } else { + this.data.viewer.like = s + } + } + } + + private incrementLike() { + if (this.data.likeCount) { + this.data.likeCount += 1 + } else { + this.data.likeCount = 1 + } + } + + private decrementLike() { + if (this.data.likeCount) { + this.data.likeCount -= 1 + } else { + this.data.likeCount = 0 + } + } + + private rewriteData(data: AppBskyFeedDefs.GeneratorView) { + this.data = data + } + + // public apis + // = + async like() { + try { + const res = await this.rootStore.agent.app.bsky.feed.like.create( + { + repo: this.rootStore.me.did, + }, + { + subject: { + uri: this.data.uri, + cid: this.data.cid, + }, + createdAt: new Date().toISOString(), + }, + ) + this.toggleLiked(res.uri) + this.incrementLike() + } catch (e: any) { + this.rootStore.log.error('Failed to like feed', e) + } + } + + async unlike() { + try { + await this.rootStore.agent.app.bsky.feed.like.delete({ + repo: this.rootStore.me.did, + rkey: new AtUri(this.data.viewer?.like!).rkey, + }) + this.toggleLiked() + this.decrementLike() + } catch (e: any) { + this.rootStore.log.error('Failed to unlike feed', e) + } + } + + static async getView(store: RootStoreModel, uri: string) { + const res = await store.agent.app.bsky.feed.getFeedGenerator({ + feed: uri, + }) + const view = res.data.view + return view + } + + async checkIsValid() { + const res = await this.rootStore.agent.app.bsky.feed.getFeedGenerator({ + feed: this.data.uri, + }) + return res.data.isValid + } + + async checkIsOnline() { + const res = await this.rootStore.agent.app.bsky.feed.getFeedGenerator({ + feed: this.data.uri, + }) + return res.data.isOnline + } + + async reload() { + const res = await this.rootStore.agent.app.bsky.feed.getFeedGenerator({ + feed: this.data.uri, + }) + this.rewriteData(res.data.view) + } + + serialize() { + return JSON.stringify(this.data) + } +} |