about summary refs log tree commit diff
path: root/src/state/models/feeds/algo/algo-item.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/models/feeds/algo/algo-item.ts')
-rw-r--r--src/state/models/feeds/algo/algo-item.ts142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/state/models/feeds/algo/algo-item.ts b/src/state/models/feeds/algo/algo-item.ts
new file mode 100644
index 000000000..bd4ea4fd6
--- /dev/null
+++ b/src/state/models/feeds/algo/algo-item.ts
@@ -0,0 +1,142 @@
+import {AppBskyFeedDefs, AtUri} from '@atproto/api'
+import {makeAutoObservable} from 'mobx'
+import {RootStoreModel} from 'state/models/root-store'
+
+export class AlgoItemModel {
+  // data
+  data: AppBskyFeedDefs.GeneratorView
+
+  constructor(
+    public rootStore: RootStoreModel,
+    view: AppBskyFeedDefs.GeneratorView,
+  ) {
+    this.data = view
+    makeAutoObservable(
+      this,
+      {
+        rootStore: false,
+      },
+      {autoBind: true},
+    )
+  }
+
+  // local actions
+  // =
+  set toggleSaved(value: boolean) {
+    console.log('toggleSaved', this.data.viewer)
+    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)
+  }
+}