Browse Source

feat: improve search results for profiles

imwald
codytseng 10 months ago
parent
commit
34c8c06ce9
  1. 2
      src/components/PostEditor/PostTextarea/suggestion.ts
  2. 17
      src/hooks/useSearchProfiles.tsx
  3. 8
      src/services/client.service.ts

2
src/components/PostEditor/PostTextarea/suggestion.ts

@ -8,7 +8,7 @@ import MentionList, { MentionListHandle, MentionListProps } from './MentionList' @@ -8,7 +8,7 @@ import MentionList, { MentionListHandle, MentionListProps } from './MentionList'
const suggestion = {
items: async ({ query }: { query: string }) => {
return await client.searchNpubs(query, 20)
return await client.searchNpubsFromCache(query, 20)
},
render: () => {

17
src/hooks/useSearchProfiles.tsx

@ -22,14 +22,27 @@ export function useSearchProfiles(search: string, limit: number) { @@ -22,14 +22,27 @@ export function useSearchProfiles(search: string, limit: number) {
setIsFetching(true)
setProfiles([])
try {
const profiles = await client.searchProfiles(
const profiles = await client.searchProfilesFromCache(search, limit)
setProfiles(profiles)
if (profiles.length >= limit) {
return
}
const existingPubkeys = new Set(profiles.map((profile) => profile.pubkey))
const fetchedProfiles = await client.searchProfiles(
searchableRelayUrls.concat(SEARCHABLE_RELAY_URLS).slice(0, 4),
{
search,
limit
}
)
if (profiles) {
if (fetchedProfiles.length) {
fetchedProfiles.forEach((profile) => {
if (existingPubkeys.has(profile.pubkey)) {
return
}
existingPubkeys.add(profile.pubkey)
profiles.push(profile)
})
setProfiles(profiles)
}
} catch (err) {

8
src/services/client.service.ts

@ -833,11 +833,17 @@ class ClientService extends EventTarget { @@ -833,11 +833,17 @@ class ClientService extends EventTarget {
this.relayListEventDataLoader.prime(event.pubkey, Promise.resolve(event))
}
async searchNpubs(query: string, limit: number = 100) {
async searchNpubsFromCache(query: string, limit: number = 100) {
const result = await this.userIndex.searchAsync(query, { limit })
return result.map((pubkey) => pubkeyToNpub(pubkey as string)).filter(Boolean) as string[]
}
async searchProfilesFromCache(query: string, limit: number = 100) {
const npubs = await this.searchNpubsFromCache(query, limit)
const profiles = await Promise.all(npubs.map((npub) => this.fetchProfile(npub)))
return profiles.filter((profile) => !!profile) as TProfile[]
}
async initUserIndexFromFollowings(pubkey: string, signal: AbortSignal) {
const followings = await this.fetchFollowings(pubkey, true)
for (let i = 0; i * 20 < followings.length; i++) {

Loading…
Cancel
Save