diff --git a/lib/handlers/user-infos-handler.react.js b/lib/handlers/user-infos-handler.react.js --- a/lib/handlers/user-infos-handler.react.js +++ b/lib/handlers/user-infos-handler.react.js @@ -70,7 +70,9 @@ // 1. Fetch usernames from identity const promise = (async () => { newUserIDs.forEach(id => requestedIDsRef.current.add(id)); - const { identities } = await findUserIdentities(newUserIDs); + const { identities, reservedUserIdentifiers } = + await findUserIdentities(newUserIDs); + newUserIDs.forEach(id => requestedIDsRef.current.delete(id)); const newUserInfos = []; @@ -80,6 +82,12 @@ username: identities[id].username, }); } + for (const id in reservedUserIdentifiers) { + newUserInfos.push({ + id, + username: reservedUserIdentifiers[id], + }); + } return { userInfos: newUserInfos }; })(); void dispatchActionPromise(findUserIdentitiesActionTypes, promise); 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 @@ -225,6 +225,27 @@ .flat(); } +function discardKeyserverUsernames( + newUserInfos: UserInfos, + stateUserInfos: UserInfos, +): UserInfos { + if (!usingCommServicesAccessToken) { + return newUserInfos; + } + let result: UserInfos = {}; + for (const id in newUserInfos) { + const username = stateUserInfos[id] ? stateUserInfos[id].username : null; + result = { + ...result, + [id]: { + ...newUserInfos[id], + username, + }, + }; + } + return result; +} + type ReduceUserInfosResult = [ UserStore, $ReadOnlyArray, @@ -241,7 +262,11 @@ if (payload.keyserverID !== authoritativeKeyserverID()) { return [state, [], []]; } - const newUserInfos = _keyBy(userInfo => userInfo.id)(payload.userInfos); + const keyserverUserInfos = _keyBy(userInfo => userInfo.id)(payload.userInfos); + const newUserInfos = discardKeyserverUsernames( + keyserverUserInfos, + state.userInfos, + ); const userStoreOps: $ReadOnlyArray = [ ...convertUserInfosToReplaceUserOps(newUserInfos), @@ -318,9 +343,13 @@ if (keyserverID !== authoritativeKeyserverID()) { return [state, [], []]; } - const newUserInfos: UserInfos = _keyBy(userInfo => userInfo.id)( + const keyserverUserInfos: UserInfos = _keyBy(userInfo => userInfo.id)( action.payload.userInfos, ); + const newUserInfos = discardKeyserverUsernames( + keyserverUserInfos, + state.userInfos, + ); const userStoreOps: $ReadOnlyArray = convertUserInfosToReplaceUserOps(newUserInfos); @@ -401,9 +430,13 @@ if (action.payload.keyserverID !== authoritativeKeyserverID()) { return [state, [], []]; } - const newUserInfos = _keyBy(userInfo => userInfo.id)( + const keyserverUserInfos = _keyBy(userInfo => userInfo.id)( action.payload.userInfos, ); + const newUserInfos = discardKeyserverUsernames( + keyserverUserInfos, + state.userInfos, + ); const userStoreOps: $ReadOnlyArray = [ { type: 'remove_all_users' }, ...convertUserInfosToReplaceUserOps(newUserInfos), @@ -450,9 +483,13 @@ action.type === keyserverAuthActionTypes.success && relyingOnAuthoritativeKeyserver ) { - const newUserInfos = _keyBy(userInfo => userInfo.id)( + const keyserverUserInfos = _keyBy(userInfo => userInfo.id)( action.payload.userInfos, ); + const newUserInfos = discardKeyserverUsernames( + keyserverUserInfos, + state.userInfos, + ); const userStoreOps: $ReadOnlyArray = convertUserInfosToReplaceUserOps(newUserInfos); @@ -503,12 +540,15 @@ return [state, [], []]; } - const userStoreOps: UserStoreOperation[] = []; - if (userInfos) { - for (const userInfo of userInfos) { - userStoreOps.push({ type: 'replace_user', payload: { ...userInfo } }); - } - } + const keyserverUserInfos = _keyBy(userInfo => userInfo.id)(userInfos); + const newUserInfos = discardKeyserverUsernames( + keyserverUserInfos, + state.userInfos, + ); + + const userStoreOps: UserStoreOperation[] = [ + ...convertUserInfosToReplaceUserOps(newUserInfos), + ]; if (deleteUserInfoIDs) { userStoreOps.push({ @@ -553,9 +593,13 @@ userStoreOps, ]; } else if (action.type === updateUserAvatarActionTypes.success) { - const newUserInfos = _keyBy(userInfo => userInfo.id)( + const keyserverUserInfos = _keyBy(userInfo => userInfo.id)( action.payload.updates.userInfos, ); + const newUserInfos = discardKeyserverUsernames( + keyserverUserInfos, + state.userInfos, + ); const userStoreOps: $ReadOnlyArray = convertUserInfosToReplaceUserOps(newUserInfos); const processedUserInfos: UserInfos = processUserStoreOps(