diff --git a/lib/shared/thread-utils.js b/lib/shared/thread-utils.js --- a/lib/shared/thread-utils.js +++ b/lib/shared/thread-utils.js @@ -44,6 +44,7 @@ usersWithPersonalThreadSelector, } from '../selectors/user-selectors.js'; import { getUserAvatarForThread } from '../shared/avatar-utils.js'; +import SentencePrefixSearchIndex from '../shared/sentence-prefix-search-index.js'; import type { CalendarQuery } from '../types/entry-types.js'; import { messageTypes } from '../types/message-types-enum.js'; import { @@ -1771,6 +1772,45 @@ ]); } +function useChatMentionSearchIndex(): { + +[id: string]: SentencePrefixSearchIndex, +} { + const { chatMentionCandidatesObj, resolvedThreadInfos } = + useChatMentionCandidatesObjAndResolvedThreadInfos(); + return React.useMemo(() => { + const result = {}; + const visitedThreads = new Set(); + for (const threadID in chatMentionCandidatesObj) { + if (visitedThreads.has(threadID) || !resolvedThreadInfos[threadID]) { + continue; + } + visitedThreads.add(threadID); + const searchIndex = new SentencePrefixSearchIndex(); + result[threadID] = searchIndex; + searchIndex.addEntry( + resolvedThreadInfos[threadID].id, + resolvedThreadInfos[threadID].uiName, + ); + for (const key in chatMentionCandidatesObj[threadID]) { + result[key] = searchIndex; + searchIndex.addEntry( + chatMentionCandidatesObj[threadID][key].id, + chatMentionCandidatesObj[threadID][key].uiName, + ); + visitedThreads.add(chatMentionCandidatesObj[threadID][key].id); + } + } + return result; + }, [chatMentionCandidatesObj, resolvedThreadInfos]); +} + +function useThreadChatMentionSearchIndex( + threadInfo: ThreadInfo, +): SentencePrefixSearchIndex { + const chatMentionCandidatesSearchIndex = useChatMentionSearchIndex(); + return chatMentionCandidatesSearchIndex[threadInfo.id]; +} + export { threadHasPermission, viewerIsMember, @@ -1842,4 +1882,5 @@ getThreadsToDeleteText, useChatMentionCandidatesObj, useThreadChatMentionCandidates, + useThreadChatMentionSearchIndex, };