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 @@ -10,7 +10,11 @@ } from '../types/thread-types'; import type { AccountUserInfo, UserListItem } from '../types/user-types'; import SearchIndex from './search-index'; -import { userIsMember, threadMemberHasPermission } from './thread-utils'; +import { + userIsMember, + threadMemberHasPermission, + getContainingThreadID, +} from './thread-utils'; const notFriendNotice = 'not friend'; @@ -32,6 +36,17 @@ ? inputParentThreadInfo : null; + const containgThreadID = threadType + ? getContainingThreadID(parentThreadInfo, threadType) + : null; + + let containingThreadInfo = null; + if (containgThreadID === parentThreadInfo?.id) { + containingThreadInfo = parentThreadInfo; + } else if (containgThreadID === communityThreadInfo?.id) { + containingThreadInfo = communityThreadInfo; + } + let results = []; const appendUserInfo = (userInfo: AccountUserInfo) => { const { id } = userInfo; @@ -51,6 +66,7 @@ results.push({ ...userInfo, isMemberOfParentThread: userIsMember(parentThreadInfo, id), + isMemberOfContainingThread: userIsMember(containingThreadInfo, id), }); }; if (text === '') { @@ -64,77 +80,91 @@ } } + const blockedRelationshipsStatuses = new Set([ + userRelationshipStatus.BLOCKED_BY_VIEWER, + userRelationshipStatus.BLOCKED_VIEWER, + userRelationshipStatus.BOTH_BLOCKED, + ]); + if (text === '') { results = results.filter(userInfo => - parentThreadInfo - ? userInfo.isMemberOfParentThread && - userInfo.relationshipStatus !== - userRelationshipStatus.BLOCKED_BY_VIEWER + containingThreadInfo + ? userInfo.isMemberOfContainingThread && + !blockedRelationshipsStatuses.has(userInfo.relationshipStatus) : userInfo.relationshipStatus === userRelationshipStatus.FRIEND, ); } const nonFriends = []; const blockedUsers = []; - const friendsAndParentMembers = []; + const friendsAndContainingThreadMembers = []; for (const userResult of results) { const relationshipStatus = userResult.relationshipStatus; if ( - userResult.isMemberOfParentThread && - relationshipStatus !== userRelationshipStatus.BLOCKED_BY_VIEWER + userResult.isMemberOfContainingThread && + !blockedRelationshipsStatuses.has(relationshipStatus) ) { - friendsAndParentMembers.unshift(userResult); + friendsAndContainingThreadMembers.unshift(userResult); } else if (relationshipStatus === userRelationshipStatus.FRIEND) { - friendsAndParentMembers.push(userResult); - } else if ( - relationshipStatus === userRelationshipStatus.BLOCKED_BY_VIEWER - ) { + friendsAndContainingThreadMembers.push(userResult); + } else if (blockedRelationshipsStatuses.has(relationshipStatus)) { blockedUsers.push(userResult); } else { nonFriends.push(userResult); } } - const sortedResults = friendsAndParentMembers + const sortedResults = friendsAndContainingThreadMembers .concat(nonFriends) .concat(blockedUsers); return sortedResults.map( - ({ isMemberOfParentThread, relationshipStatus, ...result }) => { - if ( - isMemberOfParentThread && - relationshipStatus !== userRelationshipStatus.BLOCKED_BY_VIEWER - ) { - return { ...result }; - } + ({ + isMemberOfContainingThread, + isMemberOfParentThread, + relationshipStatus, + ...result + }) => { let notice, alertText, alertTitle; - const userText = result.username; - if (!isMemberOfParentThread && threadType === threadTypes.SIDEBAR) { - notice = 'not in parent chat'; - alertTitle = 'Not in parent chat'; - alertText = 'You can only add members of the parent chat to a thread'; - } else if ( - relationshipStatus === userRelationshipStatus.BLOCKED_BY_VIEWER - ) { - notice = 'you’ve blocked this user'; - alertTitle = 'Not a friend'; + const username = result.username; + if (blockedRelationshipsStatuses.has(relationshipStatus)) { + notice = 'user is blocked'; + alertTitle = 'User is blocked'; alertText = - `Before you add ${userText} to this chat, ` + - 'you’ll need to unblock them and send a friend request. ' + - 'You can do this from the Block List and Friend List ' + + `Before you add ${username} to this chat, ` + + 'you’ll need to unblock them. You can do this from the Block List ' + 'in the Profile tab.'; - } else if (relationshipStatus !== userRelationshipStatus.FRIEND) { + } else if (!isMemberOfContainingThread && containingThreadInfo) { + if (threadType !== threadTypes.SIDEBAR) { + notice = 'not in community'; + alertTitle = 'Not in community'; + alertText = 'You can only add members of the community to this chat'; + } else { + notice = 'not in parent chat'; + alertTitle = 'Not in parent chat'; + alertText = 'You can only add members of the parent chat to a thread'; + } + } else if ( + !containingThreadInfo && + relationshipStatus !== userRelationshipStatus.FRIEND + ) { notice = notFriendNotice; alertTitle = 'Not a friend'; alertText = - `Before you add ${userText} to this chat, ` + + `Before you add ${username} to this chat, ` + 'you’ll need to send them a friend request. ' + 'You can do this from the Friend List in the Profile tab.'; - } else if (parentThreadInfo) { + } else if (parentThreadInfo && !isMemberOfParentThread) { notice = 'not in parent chat'; } - return { ...result, notice, alertText, alertTitle }; + if (notice) { + result = { ...result, notice }; + } + if (alertTitle) { + result = { ...result, alertTitle, alertText }; + } + return result; }, ); }