Reorganize custom-feed state models and add the missing _reactKey attribute
This commit is contained in:
parent
a2b089d315
commit
b672006f7e
12 changed files with 44 additions and 38 deletions
143
src/state/models/feeds/custom-feed.ts
Normal file
143
src/state/models/feeds/custom-feed.ts
Normal 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)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue