diff --git a/lib/selectors/thread-selectors.js b/lib/selectors/thread-selectors.js --- a/lib/selectors/thread-selectors.js +++ b/lib/selectors/thread-selectors.js @@ -536,6 +536,62 @@ baseThreadInfosSelectorForThreadType, ); +const baseThreadMembersSelectorForThread: ( + threadID: string, +) => ( + BaseAppState<>, +) => $ReadOnlyMap> = ( + threadID: string, +) => + createSelector( + threadInfoSelector, + (threadInfos: { + +[id: string]: ThreadInfo, + }): $ReadOnlyMap> => { + const selectedThreadInfo = threadInfos[threadID]; + const { community } = selectedThreadInfo; + + const communityThreadInfo = community ? threadInfos[community] : null; + const topMostThreadInfo = + communityThreadInfo && communityThreadInfo.type !== threadTypes.GENESIS + ? communityThreadInfo + : selectedThreadInfo; + + const { members, roles } = topMostThreadInfo; + + const roleMap = new Map>(); + + for (const role in roles) { + roleMap.set(role, []); + } + + for (const member of members) { + const memberRole = member.role; + if (!memberRole) { + continue; + } + + const memberList = roleMap.get(memberRole); + if (!memberList) { + continue; + } + + const newMemberList = [...memberList, member]; + roleMap.set(memberRole, newMemberList); + } + + return roleMap; + }, + ); + +const threadMembersSelectorForThread: ( + threadID: string, +) => ( + state: BaseAppState<>, +) => $ReadOnlyMap> = _memoize( + baseThreadMembersSelectorForThread, +); + export { ancestorThreadInfos, threadInfoSelector, @@ -557,4 +613,5 @@ pendingToRealizedThreadIDsSelector, savedEmojiAvatarSelectorForThread, threadInfosSelectorForThreadType, + threadMembersSelectorForThread, };