Reorganize custom-feed state models and add the missing _reactKey attribute

This commit is contained in:
Paul Frazee 2023-05-17 13:52:16 -05:00
parent a2b089d315
commit b672006f7e
12 changed files with 44 additions and 38 deletions

View file

@ -0,0 +1,143 @@
import {AppBskyFeedDefs, AtUri} from '@atproto/api'
import {makeAutoObservable} from 'mobx'
import {RootStoreModel} from 'state/models/root-store'
export class CustomFeedModel {
// data
_reactKey: string
data: AppBskyFeedDefs.GeneratorView
constructor(
public rootStore: RootStoreModel,
view: AppBskyFeedDefs.GeneratorView,
) {
this._reactKey = view.uri
this.data = view
makeAutoObservable(
this,
{
rootStore: false,
},
{autoBind: true},
)
}
// local actions
// =
set toggleSaved(value: boolean) {
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)
}
}