diff --git a/src/components/PostEditor/PostTextarea/suggestion.ts b/src/components/PostEditor/PostTextarea/suggestion.ts index bc32bde6..7f1336ac 100644 --- a/src/components/PostEditor/PostTextarea/suggestion.ts +++ b/src/components/PostEditor/PostTextarea/suggestion.ts @@ -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: () => { diff --git a/src/hooks/useSearchProfiles.tsx b/src/hooks/useSearchProfiles.tsx index 16c1a069..6fcfcf6c 100644 --- a/src/hooks/useSearchProfiles.tsx +++ b/src/hooks/useSearchProfiles.tsx @@ -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) { diff --git a/src/services/client.service.ts b/src/services/client.service.ts index 29e9fbf9..643278d5 100644 --- a/src/services/client.service.ts +++ b/src/services/client.service.ts @@ -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++) {