about summary refs log tree commit diff
path: root/src/state
diff options
context:
space:
mode:
Diffstat (limited to 'src/state')
-rw-r--r--src/state/models/feeds/custom-feed.ts115
-rw-r--r--src/state/models/ui/saved-feeds.ts14
2 files changed, 42 insertions, 87 deletions
diff --git a/src/state/models/feeds/custom-feed.ts b/src/state/models/feeds/custom-feed.ts
index e60ac2740..5e550ec69 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
-    }
-  }
+  // public apis
+  // =
 
-  private decrementLike() {
-    if (this.data.likeCount) {
-      this.data.likeCount -= 1
-    } else {
-      this.data.likeCount = 0
-    }
+  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
+    })
   }
 
-  private rewriteData(data: AppBskyFeedDefs.GeneratorView) {
-    this.data = data
+  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
+    })
   }
 
-  // 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()
+      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 85e77cae5..dca079b72 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)
     }
   }