Clean up the custom-feed model

zio/stable
Paul Frazee 2023-05-17 14:55:04 -05:00
parent 9c02fbb925
commit 2fd3b4ca04
5 changed files with 48 additions and 92 deletions

View File

@ -1,5 +1,5 @@
import {AppBskyFeedDefs, AtUri} from '@atproto/api'
import {makeAutoObservable} from 'mobx'
import {AppBskyFeedDefs} from '@atproto/api'
import {makeAutoObservable, runInAction} from 'mobx'
import {RootStoreModel} from 'state/models/root-store'
import {sanitizeDisplayName} from 'lib/strings/display-names'
@ -25,13 +25,8 @@ export class CustomFeedModel {
// local actions
// =
set toggleSaved(value: boolean) {
if (this.data.viewer) {
this.data.viewer.saved = value
}
}
get getUri() {
get uri() {
return this.data.uri
}
@ -50,99 +45,65 @@ export class CustomFeedModel {
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 save() {
await this.rootStore.agent.app.bsky.feed.saveFeed({
feed: this.uri,
})
runInAction(() => {
this.data.viewer = this.data.viewer || {}
this.data.viewer.saved = true
})
}
async unsave() {
await this.rootStore.agent.app.bsky.feed.unsaveFeed({
feed: this.uri,
})
runInAction(() => {
this.data.viewer = this.data.viewer || {}
this.data.viewer.saved = false
})
}
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()
const res = await this.rootStore.agent.like(this.data.uri, this.data.cid)
runInAction(() => {
this.data.viewer = this.data.viewer || {}
this.data.viewer.like = res.uri
this.data.likeCount = (this.data.likeCount || 0) + 1
})
} catch (e: any) {
this.rootStore.log.error('Failed to like feed', e)
}
}
async unlike() {
if (!this.data.viewer.like) {
return
}
try {
await this.rootStore.agent.app.bsky.feed.like.delete({
repo: this.rootStore.me.did,
rkey: new AtUri(this.data.viewer?.like!).rkey,
await this.rootStore.agent.deleteLike(this.data.viewer.like!)
runInAction(() => {
this.data.viewer = this.data.viewer || {}
this.data.viewer.like = undefined
this.data.likeCount = (this.data.likeCount || 1) - 1
})
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)
runInAction(() => {
this.data = res.data.view
})
}
serialize() {

View File

@ -184,10 +184,7 @@ export class SavedFeedsModel {
async save(algoItem: CustomFeedModel) {
try {
await this.rootStore.agent.app.bsky.feed.saveFeed({
feed: algoItem.getUri,
})
algoItem.toggleSaved = true
await algoItem.save()
this.addFeed(algoItem)
} catch (e: any) {
this.rootStore.log.error('Failed to save feed', e)
@ -195,16 +192,13 @@ export class SavedFeedsModel {
}
async unsave(algoItem: CustomFeedModel) {
const uri = algoItem.getUri
const uri = algoItem.uri
try {
await this.rootStore.agent.app.bsky.feed.unsaveFeed({
feed: uri,
})
algoItem.toggleSaved = false
await algoItem.unsave()
this.removeFeed(uri)
this.removePinnedFeed(uri)
} catch (e: any) {
this.rootStore.log.error('Failed to unsanve feed', e)
this.rootStore.log.error('Failed to unsave feed', e)
}
}

View File

@ -188,7 +188,7 @@ export function UserAvatar({
accessibilityRole="image"
/>
) : (
<DefaultAvatar size={size} />
<DefaultAvatar type={type} size={size} />
)}
<View style={[styles.editButtonContainer, pal.btn]}>
<FontAwesomeIcon

View File

@ -170,6 +170,7 @@ export function PostEmbeds({
AppBskyEmbedRecord.isView(embed) &&
AppBskyFeedDefs.isGeneratorView(embed.record)
) {
// TODO memoize this?
return (
<CustomFeed
item={new CustomFeedModel(store, embed.record)}

View File

@ -118,7 +118,7 @@ export const HomeScreen = withAuthRequired(
key={String(2 + index + 1)}
testID="customFeed"
isPageFocused={selectedPage === 2 + index}
feed={new PostsFeedModel(store, 'custom', {feed: f.getUri})}
feed={new PostsFeedModel(store, 'custom', {feed: f.uri})}
renderEmptyState={renderFollowingEmptyState}
/>
)