Various Bug Fixes (#502)
* Fix edit post with APIv4 * Fix filterProfiles * Fix intro message error for threads * Fix members to load in channel action * Fix channel members lists
This commit is contained in:
parent
1450d61da6
commit
dda0480fec
9 changed files with 55 additions and 32 deletions
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 (
|
||||
<View style={style.row}>
|
||||
<ChannelIntro/>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<View style={style.row}>
|
||||
<ChannelIntro/>
|
||||
</View>
|
||||
);
|
||||
}
|
||||
return null;
|
||||
};
|
||||
|
||||
renderRow = (row) => {
|
||||
if (row instanceof Date) {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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) => {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
});
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue