diff --git a/src/state/models/feeds/custom-feed.ts b/src/state/models/feeds/custom-feed.ts index e60ac274..5e550ec6 100644 --- a/src/state/models/feeds/custom-feed.ts +++ b/src/state/models/feeds/custom-feed.ts @@ -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() { diff --git a/src/state/models/ui/saved-feeds.ts b/src/state/models/ui/saved-feeds.ts index 85e77cae..dca079b7 100644 --- a/src/state/models/ui/saved-feeds.ts +++ b/src/state/models/ui/saved-feeds.ts @@ -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) } } diff --git a/src/view/com/util/UserAvatar.tsx b/src/view/com/util/UserAvatar.tsx index 10a605b2..1e3690fb 100644 --- a/src/view/com/util/UserAvatar.tsx +++ b/src/view/com/util/UserAvatar.tsx @@ -188,7 +188,7 @@ export function UserAvatar({ accessibilityRole="image" /> ) : ( - + )} )