diff options
Diffstat (limited to 'src/state/models/ui/search.ts')
-rw-r--r-- | src/state/models/ui/search.ts | 51 |
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 + }) + } +} |