diff --git a/lib/reducers/user-reducer.js b/lib/reducers/user-reducer.js --- a/lib/reducers/user-reducer.js +++ b/lib/reducers/user-reducer.js @@ -30,6 +30,7 @@ type UserStoreOperation, userStoreOpsHandlers, } from '../ops/user-store-ops.js'; +import { extractFIDFromUserID } from '../shared/id-utils.js'; import { stateSyncSpecs } from '../shared/state-sync/state-sync-specs.js'; import { updateSpecs } from '../shared/updates/update-specs.js'; import type { BaseAction } from '../types/redux-types.js'; @@ -291,10 +292,14 @@ if (filteredUserIDs.length === 0) { return [state, [], []]; } - const newUserInfosArray = filteredUserIDs.map(id => ({ - id, - username: null, - })); + const newUserInfosArray = filteredUserIDs.map(id => { + const avatar = extractFIDFromUserID(id) ? { type: 'farcaster' } : null; + return { + id, + username: null, + avatar, + }; + }); const newUserInfos: UserInfos = _keyBy(userInfo => userInfo.id)( newUserInfosArray, ); diff --git a/lib/shared/avatar-utils.js b/lib/shared/avatar-utils.js --- a/lib/shared/avatar-utils.js +++ b/lib/shared/avatar-utils.js @@ -266,12 +266,21 @@ } function getAvatarForUser( - usernameAndAvatar: ?{ +username?: ?string, +avatar?: ?ClientAvatar, ... }, + usernameAndAvatar: ?{ + +username?: ?string, + +avatar?: ?ClientAvatar, + +farcasterID?: ?string, + ... + }, ): ClientAvatar { if (usernameAndAvatar?.avatar) { return usernameAndAvatar.avatar; } + if (usernameAndAvatar?.farcasterID) { + return { type: 'farcaster' }; + } + if (!usernameAndAvatar?.username) { return defaultAnonymousUserEmojiAvatar; } diff --git a/native/avatars/user-avatar.react.js b/native/avatars/user-avatar.react.js --- a/native/avatars/user-avatar.react.js +++ b/native/avatars/user-avatar.react.js @@ -6,6 +6,7 @@ getAvatarForUser, useResolvedUserAvatar, } from 'lib/shared/avatar-utils.js'; +import { extractFIDFromUserID } from 'lib/shared/id-utils.js'; import type { GenericUserInfoWithAvatar, AvatarSize, @@ -27,6 +28,12 @@ const currentUserFID = useCurrentUserFID(); const userAvatarInfo = useSelector(state => { + if (userInfoProp?.avatar) { + return { + ...userInfoProp, + farcasterID: fid, + }; + } if (!userID) { return { ...userInfoProp, @@ -38,9 +45,11 @@ farcasterID: currentUserFID, }; } else { + const maybeFIDFromUserID = extractFIDFromUserID(userID); return { ...state.userStore.userInfos[userID], - farcasterID: state.auxUserStore.auxUserInfos[userID]?.fid, + farcasterID: + maybeFIDFromUserID ?? state.auxUserStore.auxUserInfos[userID]?.fid, }; } }); diff --git a/web/avatars/user-avatar.react.js b/web/avatars/user-avatar.react.js --- a/web/avatars/user-avatar.react.js +++ b/web/avatars/user-avatar.react.js @@ -6,6 +6,7 @@ getAvatarForUser, useResolvedUserAvatar, } from 'lib/shared/avatar-utils.js'; +import { extractFIDFromUserID } from 'lib/shared/id-utils.js'; import type { AvatarSize } from 'lib/types/avatar-types.js'; import { useCurrentUserFID } from 'lib/utils/farcaster-utils.js'; @@ -31,9 +32,11 @@ farcasterID: currentUserFID, }; } else { + const maybeFIDFromUserID = extractFIDFromUserID(userID); return { ...state.userStore.userInfos[userID], - farcasterID: state.auxUserStore.auxUserInfos[userID]?.fid, + farcasterID: + maybeFIDFromUserID ?? state.auxUserStore.auxUserInfos[userID]?.fid, }; } });