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 @@ -18,11 +18,16 @@ import { threadPermissions } from '../types/thread-permission-types.js'; import { type ThreadType, threadTypes } from '../types/thread-types-enum.js'; import { type ThreadInfo } from '../types/thread-types.js'; -import type { AccountUserInfo, UserListItem } from '../types/user-types.js'; +import type { + AccountUserInfo, + UserListItem, + GlobalAccountUserInfo, +} from '../types/user-types.js'; import { useServerCall, useDispatchActionPromise, } from '../utils/action-utils.js'; +import { values } from '../utils/objects.js'; const notFriendNotice = 'not friend'; @@ -31,6 +36,7 @@ userInfos: { +[id: string]: AccountUserInfo }, searchIndex: SearchIndex, excludeUserIDs: $ReadOnlyArray, + includeServerSearchUsers: ?$ReadOnlyArray, inputParentThreadInfo: ?ThreadInfo, inputCommunityThreadInfo: ?ThreadInfo, threadType: ?ThreadType, @@ -55,10 +61,18 @@ containingThreadInfo = communityThreadInfo; } - let results = []; - const appendUserInfo = (userInfo: AccountUserInfo) => { + const results: { + [id: string]: { + ...AccountUserInfo | GlobalAccountUserInfo, + isMemberOfParentThread: boolean, + isMemberOfContainingThread: boolean, + }, + } = {}; + const appendUserInfo = ( + userInfo: AccountUserInfo | GlobalAccountUserInfo, + ) => { const { id } = userInfo; - if (excludeUserIDs.includes(id)) { + if (excludeUserIDs.includes(id) || id in results) { return; } if ( @@ -71,11 +85,11 @@ ) { return; } - results.push({ + results[id] = { ...userInfo, isMemberOfParentThread: userIsMember(parentThreadInfo, id), isMemberOfContainingThread: userIsMember(containingThreadInfo, id), - }); + }; }; if (text === '') { for (const id in userInfos) { @@ -88,14 +102,21 @@ } } + if (includeServerSearchUsers) { + for (const userInfo of includeServerSearchUsers) { + appendUserInfo(userInfo); + } + } + const blockedRelationshipsStatuses = new Set([ userRelationshipStatus.BLOCKED_BY_VIEWER, userRelationshipStatus.BLOCKED_VIEWER, userRelationshipStatus.BOTH_BLOCKED, ]); + let userResults = values(results); if (text === '') { - results = results.filter(userInfo => + userResults = userResults.filter(userInfo => containingThreadInfo ? userInfo.isMemberOfContainingThread && !blockedRelationshipsStatuses.has(userInfo.relationshipStatus) @@ -109,7 +130,7 @@ const containingThreadMembers = []; const parentThreadMembers = []; - for (const userResult of results) { + for (const userResult of userResults) { const relationshipStatus = userResult.relationshipStatus; if (blockedRelationshipsStatuses.has(relationshipStatus)) { blockedUsers.push(userResult); diff --git a/native/chat/compose-subchannel.react.js b/native/chat/compose-subchannel.react.js --- a/native/chat/compose-subchannel.react.js +++ b/native/chat/compose-subchannel.react.js @@ -203,6 +203,7 @@ otherUserInfos, userSearchIndex, userInfoInputIDs, + [], parentThreadInfo, communityThreadInfo, threadType, diff --git a/native/chat/settings/add-users-modal.react.js b/native/chat/settings/add-users-modal.react.js --- a/native/chat/settings/add-users-modal.react.js +++ b/native/chat/settings/add-users-modal.react.js @@ -176,6 +176,7 @@ otherUserInfos, userSearchIndex, excludeUserIDs, + [], parentThreadInfo, communityThreadInfo, threadInfo.type, diff --git a/web/modals/threads/members/add-members-modal.react.js b/web/modals/threads/members/add-members-modal.react.js --- a/web/modals/threads/members/add-members-modal.react.js +++ b/web/modals/threads/members/add-members-modal.react.js @@ -64,6 +64,7 @@ otherUserInfos, userSearchIndex, excludeUserIDs, + [], parentThreadInfo, communityThreadInfo, threadInfo.type,