about summary refs log tree commit diff
path: root/src/state/models/ui/search.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/state/models/ui/search.ts')
-rw-r--r--src/state/models/ui/search.ts51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/state/models/ui/search.ts b/src/state/models/ui/search.ts
new file mode 100644
index 000000000..91e1b24bf
--- /dev/null
+++ b/src/state/models/ui/search.ts
@@ -0,0 +1,51 @@
+import {makeAutoObservable, runInAction} from 'mobx'
+import {searchProfiles, searchPosts} from 'lib/api/search'
+import {AppBskyActorProfile as Profile} from '@atproto/api'
+import {RootStoreModel} from '../root-store'
+
+export class SearchUIModel {
+  isPostsLoading = false
+  isProfilesLoading = false
+  query: string = ''
+  postUris: string[] = []
+  profiles: Profile.View[] = []
+
+  constructor(public rootStore: RootStoreModel) {
+    makeAutoObservable(this)
+  }
+
+  async fetch(q: string) {
+    this.postUris = []
+    this.profiles = []
+    this.query = q
+    if (!q.trim()) {
+      return
+    }
+
+    this.isPostsLoading = true
+    this.isProfilesLoading = true
+
+    const [postsSearch, profilesSearch] = await Promise.all([
+      searchPosts(q).catch(_e => []),
+      searchProfiles(q).catch(_e => []),
+    ])
+    runInAction(() => {
+      this.postUris = postsSearch?.map(p => `at://${p.user.did}/${p.tid}`) || []
+      this.isPostsLoading = false
+    })
+
+    let profiles: Profile.View[] = []
+    if (profilesSearch?.length) {
+      do {
+        const res = await this.rootStore.api.app.bsky.actor.getProfiles({
+          actors: profilesSearch.splice(0, 25).map(p => p.did),
+        })
+        profiles = profiles.concat(res.data.profiles)
+      } while (profilesSearch.length)
+    }
+    runInAction(() => {
+      this.profiles = profiles
+      this.isProfilesLoading = false
+    })
+  }
+}