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 @@ -44,4 +44,45 @@ ); } -export { useUsersSupportThickThreads }; +function useUsersSupportFarcasterDCs(): ( + userIDs: $ReadOnlyArray, +) => Promise<$ReadOnlyMap> { + const findUserIdentities = useFindUserIdentities(); + const auxUserInfos = useSelector(state => state.auxUserStore.auxUserInfos); + + return React.useCallback( + async (userIDs: $ReadOnlyArray) => { + const usersSupportingFCDCs = new Map(); + + const usersNeedingFetch = []; + for (const userID of userIDs) { + if (auxUserInfos[userID]?.supportsFarcasterDCs) { + usersSupportingFCDCs.set(userID, true); + } else { + usersNeedingFetch.push(userID); + } + } + if (usersNeedingFetch.length > 0) { + const { identities, reservedUserIdentifiers } = + await findUserIdentities(usersNeedingFetch); + for (const userID of usersNeedingFetch) { + // for reserved users, we set DCs support to false + const isReserved = !!reservedUserIdentifiers[userID]; + const doesNotExist = identities[userID] === undefined && !isReserved; + + if (identities[userID]?.hasFarcasterDCsToken) { + usersSupportingFCDCs.set(userID, true); + } else if (doesNotExist) { + usersSupportingFCDCs.set(userID, undefined); + } else { + usersSupportingFCDCs.set(userID, false); + } + } + } + return usersSupportingFCDCs; + }, + [auxUserInfos, findUserIdentities], + ); +} + +export { useUsersSupportThickThreads, useUsersSupportFarcasterDCs };