about summary refs log tree commit diff
path: root/src/state/models/invited-users.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/models/invited-users.ts')
-rw-r--r--src/state/models/invited-users.ts70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/state/models/invited-users.ts b/src/state/models/invited-users.ts
new file mode 100644
index 000000000..121161a32
--- /dev/null
+++ b/src/state/models/invited-users.ts
@@ -0,0 +1,70 @@
+import {makeAutoObservable, runInAction} from 'mobx'
+import {ComAtprotoServerDefs, AppBskyActorDefs} from '@atproto/api'
+import {RootStoreModel} from './root-store'
+import {isObj, hasProp, isStrArray} from 'lib/type-guards'
+
+export class InvitedUsers {
+  seenDids: string[] = []
+  profiles: AppBskyActorDefs.ProfileViewDetailed[] = []
+
+  get numNotifs() {
+    return this.profiles.length
+  }
+
+  constructor(public rootStore: RootStoreModel) {
+    makeAutoObservable(
+      this,
+      {rootStore: false, serialize: false, hydrate: false},
+      {autoBind: true},
+    )
+  }
+
+  serialize() {
+    return {seenDids: this.seenDids}
+  }
+
+  hydrate(v: unknown) {
+    if (isObj(v) && hasProp(v, 'seenDids') && isStrArray(v.seenDids)) {
+      this.seenDids = v.seenDids
+    }
+  }
+
+  async fetch(invites: ComAtprotoServerDefs.InviteCode[]) {
+    // pull the dids of invited users not marked seen
+    const dids = []
+    for (const invite of invites) {
+      for (const use of invite.uses) {
+        if (!this.seenDids.includes(use.usedBy)) {
+          dids.push(use.usedBy)
+        }
+      }
+    }
+
+    // fetch their profiles
+    this.profiles = []
+    if (dids.length) {
+      try {
+        const res = await this.rootStore.agent.app.bsky.actor.getProfiles({
+          actors: dids,
+        })
+        runInAction(() => {
+          // save the ones following -- these are the ones we want to notify the user about
+          this.profiles = res.data.profiles.filter(
+            profile => !profile.viewer?.following,
+          )
+        })
+        this.rootStore.me.follows.hydrateProfiles(this.profiles)
+      } catch (e) {
+        this.rootStore.log.error(
+          'Failed to fetch profiles for invited users',
+          e,
+        )
+      }
+    }
+  }
+
+  markSeen(did: string) {
+    this.seenDids.push(did)
+    this.profiles = this.profiles.filter(profile => profile.did !== did)
+  }
+}