diff --git a/lib/hooks/user-identities-hooks.js b/lib/hooks/user-identities-hooks.js --- a/lib/hooks/user-identities-hooks.js +++ b/lib/hooks/user-identities-hooks.js @@ -1,8 +1,11 @@ // @flow +import invariant from 'invariant'; import * as React from 'react'; import { useFindUserIdentities } from '../actions/find-user-identities-actions.js'; +import { IdentityClientContext } from '../shared/identity-client-context.js'; +import type { FarcasterUser } from '../types/identity-service-types.js'; import { useSelector } from '../utils/redux-utils.js'; function useUsersSupportThickThreads(): ( @@ -85,4 +88,58 @@ ); } -export { useUsersSupportThickThreads, useUsersSupportFarcasterDCs }; +export type FCUserInfos = $ReadOnlyMap; +export type GetCommFCUsersForFIDs = ( + farcasterIDs: $ReadOnlyArray, +) => Promise; + +function useGetCommFCUsersForFIDs(): GetCommFCUsersForFIDs { + const auxUserInfos = useSelector(state => state.auxUserStore.auxUserInfos); + const userInfos = useSelector(state => state.userStore.userInfos); + + const identityClientContext = React.useContext(IdentityClientContext); + invariant(identityClientContext, 'NeynarClientContext is missing'); + + const { identityClient } = identityClientContext; + + return React.useCallback( + async (farcasterIDs: $ReadOnlyArray) => { + const fcUsers = new Map(); + const unresolvedFIDs = new Set(farcasterIDs.map(fid => `${fid}`)); + + for (const [userID, auxUserInfo] of Object.entries(auxUserInfos)) { + const { fid, supportsFarcasterDCs } = auxUserInfo; + + const username = userInfos[userID]?.username; + if (fid && username && unresolvedFIDs.delete(fid)) { + fcUsers.set(fid, { + userID, + farcasterID: fid, + username, + supportsFarcasterDCs: !!supportsFarcasterDCs, + }); + } + } + + if (unresolvedFIDs.size > 0) { + const fetchedInfos = await identityClient.getFarcasterUsers([ + ...unresolvedFIDs, + ]); + for (const fcUserInfo of fetchedInfos) { + fcUsers.set(fcUserInfo.farcasterID, fcUserInfo); + unresolvedFIDs.delete(fcUserInfo.farcasterID); + } + } + + unresolvedFIDs.forEach(missingFID => fcUsers.set(missingFID, undefined)); + return fcUsers; + }, + [userInfos, auxUserInfos, identityClient], + ); +} + +export { + useUsersSupportThickThreads, + useUsersSupportFarcasterDCs, + useGetCommFCUsersForFIDs, +};