diff --git a/app/components/autocomplete/at_mention/at_mention.js b/app/components/autocomplete/at_mention/at_mention.js index 72905573d..ce65b34f2 100644 --- a/app/components/autocomplete/at_mention/at_mention.js +++ b/app/components/autocomplete/at_mention/at_mention.js @@ -57,7 +57,7 @@ export default class AtMention extends PureComponent { } componentWillReceiveProps(nextProps) { - const {inChannel, outChannel, teamMembers, isSearch, matchTerm, requestStatus} = nextProps; + const {groups, inChannel, outChannel, teamMembers, isSearch, matchTerm, requestStatus} = nextProps; // Not invoked, render nothing. if (matchTerm === null) { @@ -83,8 +83,13 @@ export default class AtMention extends PureComponent { } // Server request is complete - if (requestStatus !== RequestStatus.STARTED && - (inChannel !== this.props.inChannel || outChannel !== this.props.outChannel || teamMembers !== this.props.teamMembers)) { + if ( + groups !== this.props.groups || + ( + requestStatus !== RequestStatus.STARTED && + (inChannel !== this.props.inChannel || outChannel !== this.props.outChannel || teamMembers !== this.props.teamMembers) + ) + ) { const sections = this.buildSections(nextProps); this.setState({ sections, diff --git a/app/mm-redux/selectors/entities/groups.ts b/app/mm-redux/selectors/entities/groups.ts index fc2964520..9de8f5770 100644 --- a/app/mm-redux/selectors/entities/groups.ts +++ b/app/mm-redux/selectors/entities/groups.ts @@ -57,34 +57,41 @@ export function getGroupMembers(state: GlobalState, id: string) { return groupMemberData.members; } -export function searchAssociatedGroupsForReferenceLocal(state: GlobalState, term: string, teamId: string, channelId: string): Array { - const groups = getAssociatedGroupsForReference(state, teamId, channelId); - if (!groups || groups.length === 0) { - return emptyList; - } - const filteredGroups = filterGroupsMatchingTerm(groups, term); - return filteredGroups; -} +export const getAssociatedGroupsForReference = reselect.createSelector( + (state: GlobalState, teamId: string, channelId: string) => { + const team = getTeam(state, teamId); + const channel = getChannel(state, channelId); + let groupsForReference = []; + if (team && team.group_constrained && channel && channel.group_constrained) { + const groupsFromChannel = getGroupsAssociatedToChannelForReference(state, channelId); + const groupsFromTeam = getGroupsAssociatedToTeamForReference(state, teamId); + groupsForReference = groupsFromChannel.concat(groupsFromTeam.filter((item) => groupsFromChannel.indexOf(item) < 0)); + } else if (team && team.group_constrained) { + groupsForReference = getGroupsAssociatedToTeamForReference(state, teamId); + } else if (channel && channel.group_constrained) { + groupsForReference = getGroupsAssociatedToChannelForReference(state, channelId); + } else { + groupsForReference = getAllAssociatedGroupsForReference(state); + } + return groupsForReference; + }, + (state: GlobalState) => getCurrentUserLocale(state), + (groupsForReference: Array, locale: string) => { + return groupsForReference.sort((groupA: Group, groupB: Group) => groupA.name.localeCompare(groupB.name, locale)); + }, +); -export function getAssociatedGroupsForReference(state: GlobalState, teamId: string, channelId: string): Array { - const team = getTeam(state, teamId); - const channel = getChannel(state, channelId); - const locale = getCurrentUserLocale(state); - - let groupsForReference = []; - if (team && team.group_constrained && channel && channel.group_constrained) { - const groupsFromChannel = getGroupsAssociatedToChannelForReference(state, channelId); - const groupsFromTeam = getGroupsAssociatedToTeamForReference(state, teamId); - groupsForReference = groupsFromChannel.concat(groupsFromTeam.filter((item) => groupsFromChannel.indexOf(item) < 0)); - } else if (team && team.group_constrained) { - groupsForReference = getGroupsAssociatedToTeamForReference(state, teamId); - } else if (channel && channel.group_constrained) { - groupsForReference = getGroupsAssociatedToChannelForReference(state, channelId); - } else { - groupsForReference = getAllAssociatedGroupsForReference(state); - } - return groupsForReference.sort((groupA: Group, groupB: Group) => groupA.name.localeCompare(groupB.name, locale)); -} +export const searchAssociatedGroupsForReferenceLocal = reselect.createSelector( + (state: GlobalState, term: string, teamId: string, channelId: string) => getAssociatedGroupsForReference(state, teamId, channelId), + (state: GlobalState, term: string) => term, + (groups: Array, term: string) => { + if (!groups || groups.length === 0) { + return emptyList; + } + const filteredGroups = filterGroupsMatchingTerm(groups, term); + return filteredGroups; + }, +); export const getAssociatedGroupsForReferenceMap = reselect.createSelector( getAssociatedGroupsForReference,