diff --git a/app/actions/views/channel.js b/app/actions/views/channel.js index 1d39535b5..a1da5a2eb 100644 --- a/app/actions/views/channel.js +++ b/app/actions/views/channel.js @@ -126,7 +126,7 @@ export function loadProfilesAndTeamMembersForDMSidebar(teamId) { let membersToLoad = members; if (membersInTeam[teamId]) { - membersToLoad = members.filter((m) => !membersInTeam[teamId].has(m)); + membersToLoad = members.filter((m) => !membersInTeam[teamId].hasOwnProperty(m)); } if (membersToLoad.length) { diff --git a/app/actions/views/channel_add_members.js b/app/actions/views/channel_add_members.js index 73495d2b7..2e0dd4d7c 100644 --- a/app/actions/views/channel_add_members.js +++ b/app/actions/views/channel_add_members.js @@ -3,10 +3,10 @@ import {addChannelMember} from 'mattermost-redux/actions/channels'; -export function handleAddChannelMembers(teamId, channelId, members) { +export function handleAddChannelMembers(channelId, members) { return async (dispatch, getState) => { try { - const requests = members.map((m) => dispatch(addChannelMember(teamId, channelId, m, getState))); + const requests = members.map((m) => dispatch(addChannelMember(channelId, m, getState))); await Promise.all(requests); } catch (error) { diff --git a/app/components/post_list/post_list.js b/app/components/post_list/post_list.js index dc756313c..c7a4f84a3 100644 --- a/app/components/post_list/post_list.js +++ b/app/components/post_list/post_list.js @@ -21,7 +21,7 @@ const LOAD_MORE_POSTS = 'load-more-posts'; export default class PostList extends Component { static propTypes = { - channel: PropTypes.object.isRequired, + channel: PropTypes.object, channelIsLoading: PropTypes.bool.isRequired, posts: PropTypes.array.isRequired, theme: PropTypes.object.isRequired, @@ -76,18 +76,22 @@ export default class PostList extends Component { renderChannelIntro = () => { const {channel, channelIsLoading, posts} = this.props; - const firstPostHasRendered = channel.total_msg_count ? posts.length > 0 : true; - const messageCount = channel.total_msg_count - posts.length; - if (channelIsLoading || !firstPostHasRendered || messageCount > Posts.POST_CHUNK_SIZE) { - return null; + if (channel) { + const firstPostHasRendered = channel.total_msg_count ? posts.length > 0 : true; + const messageCount = channel.total_msg_count - posts.length; + if (channelIsLoading || !firstPostHasRendered || messageCount > Posts.POST_CHUNK_SIZE) { + return null; + } + + return ( + + + + ); } - return ( - - - - ); - } + return null; + }; renderRow = (row) => { if (row instanceof Date) { diff --git a/app/scenes/channel_add_members/channel_add_members.js b/app/scenes/channel_add_members/channel_add_members.js index db631c7ed..0a52bb227 100644 --- a/app/scenes/channel_add_members/channel_add_members.js +++ b/app/scenes/channel_add_members/channel_add_members.js @@ -15,12 +15,12 @@ import { import ActionButton from 'app/components/action_button'; import MemberList from 'app/components/custom_list'; import SearchBar from 'app/components/search_bar'; -import {createMembersSections, loadingText, renderMemberRow} from 'app/utils/member_list'; +import {createMembersSections, loadingText, markSelectedProfiles, renderMemberRow} from 'app/utils/member_list'; import {changeOpacity, makeStyleSheetFromTheme} from 'app/utils/theme'; import {General, RequestStatus} from 'mattermost-redux/constants'; import EventEmitter from 'mattermost-redux/utils/event_emitter'; -import {filterProfiles} from 'mattermost-redux/utils/user_utils'; +import {filterProfilesMatchingTerm} from 'mattermost-redux/utils/user_utils'; class ChannelAddMembers extends PureComponent { static propTypes = { @@ -108,11 +108,17 @@ class ChannelAddMembers extends PureComponent { if (loadMoreRequestStatus === RequestStatus.STARTED && nextProps.loadMoreRequestStatus === RequestStatus.SUCCESS) { const {page} = this.state; - const profiles = nextProps.membersNotInChannel.splice(0, (page + 1) * General.PROFILE_CHUNK_SIZE); + const profiles = markSelectedProfiles( + nextProps.membersNotInChannel.splice(0, (page + 1) * General.PROFILE_CHUNK_SIZE), + this.state.selectedMembers + ); this.setState({profiles, showNoResults: true}); } else if (this.state.searching && nextProps.searchRequestStatus === RequestStatus.SUCCESS) { - const results = filterProfiles(nextProps.membersNotInChannel, this.state.term); + const results = markSelectedProfiles( + filterProfilesMatchingTerm(nextProps.membersNotInChannel, this.state.term), + this.state.selectedMembers + ); this.setState({profiles: results, showNoResults: true}); } @@ -138,7 +144,7 @@ class ChannelAddMembers extends PureComponent { handleAddMembersPress = () => { const {selectedMembers} = this.state; - const {actions, currentTeam, currentChannel} = this.props; + const {actions, currentChannel} = this.props; const membersToAdd = Object.keys(selectedMembers).filter((m) => selectedMembers[m]); if (!membersToAdd.length) { @@ -146,7 +152,7 @@ class ChannelAddMembers extends PureComponent { return; } - actions.handleAddChannelMembers(currentTeam.id, currentChannel.id, membersToAdd); + actions.handleAddChannelMembers(currentChannel.id, membersToAdd); }; handleAndroidKeyboard = () => { @@ -181,6 +187,7 @@ class ChannelAddMembers extends PureComponent { this.emitCanAddMembers(false); } this.setState({ + profiles: markSelectedProfiles(this.state.profiles, selectedMembers), selectedMembers }); }; @@ -223,7 +230,7 @@ class ChannelAddMembers extends PureComponent { searching: false, term: null, page: 0, - profiles: this.props.membersNotInChannel + profiles: markSelectedProfiles(this.props.membersNotInChannel, this.state.selectedMembers) }); }; diff --git a/app/scenes/channel_members/channel_members.js b/app/scenes/channel_members/channel_members.js index 6e5c0f745..eaea29218 100644 --- a/app/scenes/channel_members/channel_members.js +++ b/app/scenes/channel_members/channel_members.js @@ -14,13 +14,13 @@ import {injectIntl, intlShape} from 'react-intl'; import MemberList from 'app/components/custom_list'; import SearchBar from 'app/components/search_bar'; -import {createMembersSections, loadingText} from 'app/utils/member_list'; +import {createMembersSections, loadingText, markSelectedProfiles} from 'app/utils/member_list'; import MemberListRow from 'app/components/custom_list/member_list_row'; import {changeOpacity, makeStyleSheetFromTheme} from 'app/utils/theme'; import {General, RequestStatus} from 'mattermost-redux/constants'; import EventEmitter from 'mattermost-redux/utils/event_emitter'; -import {displayUsername, filterProfiles} from 'mattermost-redux/utils/user_utils'; +import {displayUsername, filterProfilesMatchingTerm} from 'mattermost-redux/utils/user_utils'; import ChannelMembersTitle from './channel_members_title'; import RemoveMemberButton from './remove_member_button'; @@ -102,11 +102,17 @@ class ChannelMembers extends PureComponent { if (requestStatus === RequestStatus.STARTED && nextProps.requestStatus === RequestStatus.SUCCESS) { const {page} = this.state; - const profiles = nextProps.currentChannelMembers.splice(0, (page + 1) * General.PROFILE_CHUNK_SIZE); + const profiles = markSelectedProfiles( + nextProps.currentChannelMembers.splice(0, (page + 1) * General.PROFILE_CHUNK_SIZE), + this.state.selectedMembers + ); this.setState({profiles, showNoResults: true}); } else if (this.state.searching && nextProps.searchRequestStatus === RequestStatus.SUCCESS) { - const results = filterProfiles(nextProps.currentChannelMembers, this.state.term); + const results = markSelectedProfiles( + filterProfilesMatchingTerm(nextProps.currentChannelMembers, this.state.term), + this.state.selectedMembers + ); this.setState({profiles: results, showNoResults: true}); } @@ -203,6 +209,7 @@ class ChannelMembers extends PureComponent { this.emitCanRemoveMembers(false); } this.setState({ + profiles: markSelectedProfiles(this.state.profiles, selectedMembers), selectedMembers }); }; @@ -244,7 +251,7 @@ class ChannelMembers extends PureComponent { searching: false, term: null, page: 0, - profiles: this.props.currentChannelMembers + profiles: markSelectedProfiles(this.props.currentChannelMembers, this.state.selectedMembers) }); }; diff --git a/app/scenes/edit_post/edit_post.js b/app/scenes/edit_post/edit_post.js index c92fbfe42..cc9d228b4 100644 --- a/app/scenes/edit_post/edit_post.js +++ b/app/scenes/edit_post/edit_post.js @@ -21,7 +21,6 @@ import EventEmitter from 'mattermost-redux/utils/event_emitter'; export default class EditPost extends PureComponent { static propTypes = { - currentTeamId: PropTypes.string.isRequired, editPostRequest: PropTypes.object.isRequired, post: PropTypes.object.isRequired, theme: PropTypes.object.isRequired, @@ -71,7 +70,7 @@ export default class EditPost extends PureComponent { onEditPost = async () => { const {message} = this.state; const post = Object.assign({}, this.props.post, {message}); - await this.props.actions.editPost(this.props.currentTeamId, post); + await this.props.actions.editPost(post); }; onPostChangeText = (message) => { diff --git a/app/scenes/edit_post/index.js b/app/scenes/edit_post/index.js index b51b6c778..800a78efc 100644 --- a/app/scenes/edit_post/index.js +++ b/app/scenes/edit_post/index.js @@ -9,7 +9,6 @@ import {closeModal} from 'app/actions/navigation'; import {getTheme} from 'app/selectors/preferences'; import {editPost} from 'mattermost-redux/actions/posts'; -import {getCurrentTeamId} from 'mattermost-redux/selectors/entities/teams'; import EditPost from './edit_post'; @@ -18,7 +17,6 @@ function mapStateToProps(state, ownProps) { return { ...ownProps, - currentTeamId: getCurrentTeamId(state), editPostRequest, post: ownProps.post, theme: getTheme(state) diff --git a/app/scenes/more_dms/more_dms.js b/app/scenes/more_dms/more_dms.js index dde0c848b..a45c4bd77 100644 --- a/app/scenes/more_dms/more_dms.js +++ b/app/scenes/more_dms/more_dms.js @@ -20,7 +20,7 @@ import {createMembersSections, loadingText, renderMemberRow} from 'app/utils/mem import {makeStyleSheetFromTheme, changeOpacity} from 'app/utils/theme'; import {General, RequestStatus} from 'mattermost-redux/constants'; -import {filterProfiles} from 'mattermost-redux/utils/user_utils'; +import {filterProfilesMatchingTerm} from 'mattermost-redux/utils/user_utils'; class MoreDirectMessages extends PureComponent { static propTypes = { @@ -86,7 +86,7 @@ class MoreDirectMessages extends PureComponent { this.setState({profiles, showNoResults: true}); } else if (this.state.searching && nextProps.searchRequest.status === RequestStatus.SUCCESS) { - const results = filterProfiles(nextProps.profiles, this.state.term); + const results = filterProfilesMatchingTerm(nextProps.profiles, this.state.term); this.setState({profiles: results, showNoResults: true}); } } diff --git a/app/utils/member_list.js b/app/utils/member_list.js index 4b45ff274..3a6a081c9 100644 --- a/app/utils/member_list.js +++ b/app/utils/member_list.js @@ -48,3 +48,11 @@ export function renderMemberRow(user, sectionId, rowId, preferences, theme, sele /> ); } + +export function markSelectedProfiles(profiles, selectedProfiles) { + return profiles.map((p) => { + const profile = {...p}; + profile.selected = selectedProfiles[p.id]; + return profile; + }); +}