diff --git a/lib/shared/search-utils.js b/lib/shared/search-utils.js --- a/lib/shared/search-utils.js +++ b/lib/shared/search-utils.js @@ -2,7 +2,8 @@ import * as React from 'react'; -import { messageID } from './id-utils.js'; +import { useGetFarcasterDirectCastUsers } from './farcaster/farcaster-api.js'; +import { messageID, userIDFromFID } from './id-utils.js'; import SearchIndex from './search-index.js'; import { getContainingThreadID, @@ -421,12 +422,15 @@ type UseSearchUsersOptions = { +includeViewer?: ?boolean, + +searchFarcaster?: ?boolean, }; function useSearchUsers( usernameInputText: string, options?: ?UseSearchUsersOptions, ): $ReadOnlyArray { const includeViewer = !!options?.includeViewer; + const searchFarcaster = !!options?.searchFarcaster; + const currentUserID = useSelector( state => state.currentUserInfo && state.currentUserInfo.id, ); @@ -453,6 +457,8 @@ sendPrefixQuery: callIdentitySearchUsers, } = useIdentitySearch(); + const findFarcasterDCUsers = useGetFarcasterDirectCastUsers(); + const dispatchActionPromise = useDispatchActionPromise(); React.useEffect(() => { @@ -461,21 +467,54 @@ return; } const searchUsersPromise = (async () => { - if (identitySearchSocketConnected) { - try { - const identitySearchResult = await callIdentitySearchUsers( - forwardLookupSearchText, - ); - const userInfos = identitySearchResult.map(user => ({ - id: user.userID, - username: user.username, - avatar: null, - })); - setSearchResultsFromServer(userInfos); - return; - } catch (err) { - console.error(err); + const foundInfos: Array = []; + + const identityPromise = (async () => { + if (identitySearchSocketConnected) { + try { + const identitySearchResult = await callIdentitySearchUsers( + forwardLookupSearchText, + ); + const userInfos = identitySearchResult.map(user => ({ + id: user.userID, + username: user.username, + avatar: null, + })); + foundInfos.push(...userInfos); + } catch (err) { + console.error('identity search error', err); + } + } + })(); + + const farcasterPromise = (async () => { + if (searchFarcaster) { + try { + const fcSearchResult = await findFarcasterDCUsers({ + q: forwardLookupSearchText, + }); + const userInfos = fcSearchResult.result.users.map(fcUser => ({ + id: userIDFromFID(fcUser.fid.toString()), + username: fcUser.username ?? 'anonymous', + avatar: fcUser.pfp + ? { + type: 'image', + uri: fcUser.pfp.url, + } + : null, + })); + foundInfos.push(...userInfos); + } catch (err) { + console.error('farcaster user search error', err); + } } + })(); + + await Promise.all([identityPromise, farcasterPromise]); + + if (foundInfos.length > 0) { + setSearchResultsFromServer(foundInfos); + return; } const { userInfos: keyserverSearchResult } = await callLegacyAshoatKeyserverSearchUsers(forwardLookupSearchText); @@ -489,6 +528,8 @@ identitySearchSocketConnected, dispatchActionPromise, forwardLookupSearchText, + findFarcasterDCUsers, + searchFarcaster, ]); return searchResults; }