// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import FilteredUserList from './filtered_user_list.jsx'; import LoadingScreen from './loading_screen.jsx'; import ChannelInviteModal from './channel_invite_modal.jsx'; import UserStore from 'stores/user_store.jsx'; import ChannelStore from 'stores/channel_store.jsx'; import * as AsyncClient from 'utils/async_client.jsx'; import * as Client from 'utils/client.jsx'; import * as Utils from 'utils/utils.jsx'; import {FormattedMessage} from 'react-intl'; import {Modal} from 'react-bootstrap'; import React from 'react'; export default class ChannelMembersModal extends React.Component { constructor(props) { super(props); this.getStateFromStores = this.getStateFromStores.bind(this); this.onChange = this.onChange.bind(this); this.handleRemove = this.handleRemove.bind(this); this.createRemoveMemberButton = this.createRemoveMemberButton.bind(this); // the rest of the state gets populated when the modal is shown this.state = { showInviteModal: false }; } shouldComponentUpdate(nextProps, nextState) { if (!Utils.areObjectsEqual(this.props, nextProps)) { return true; } if (!Utils.areObjectsEqual(this.state, nextState)) { return true; } return false; } getStateFromStores() { const extraInfo = ChannelStore.getCurrentExtraInfo(); const profiles = UserStore.getActiveOnlyProfiles(); if (extraInfo.member_count !== extraInfo.members.length) { AsyncClient.getChannelExtraInfo(this.props.channel.id, -1); return { loading: true }; } const memberList = extraInfo.members.map((member) => { return profiles[member.id]; }); function compareByUsername(a, b) { if (a.username < b.username) { return -1; } else if (a.username > b.username) { return 1; } return 0; } memberList.sort(compareByUsername); return { memberList, loading: false }; } componentWillReceiveProps(nextProps) { if (!this.props.show && nextProps.show) { ChannelStore.addExtraInfoChangeListener(this.onChange); ChannelStore.addChangeListener(this.onChange); this.onChange(); } else if (this.props.show && !nextProps.show) { ChannelStore.removeExtraInfoChangeListener(this.onChange); ChannelStore.removeChangeListener(this.onChange); } } onChange() { const newState = this.getStateFromStores(); if (!Utils.areObjectsEqual(this.state, newState)) { this.setState(newState); } } handleRemove(user) { const userId = user.id; const data = {}; data.user_id = userId; Client.removeChannelMember( ChannelStore.getCurrentId(), data, () => { const memberList = this.state.memberList.slice(); for (let i = 0; i < memberList.length; i++) { if (userId === memberList[i].id) { memberList.splice(i, 1); break; } } this.setState({memberList}); AsyncClient.getChannelExtraInfo(); }, (err) => { this.setState({inviteError: err.message}); } ); } createRemoveMemberButton({user}) { if (user.id === UserStore.getCurrentId()) { return null; } return ( ); } render() { let content; if (this.state.loading) { content = (); } else { let maxHeight = 1000; if (Utils.windowHeight() <= 1200) { maxHeight = Utils.windowHeight() - 300; } content = ( ); } return (
{this.props.channel.display_name} { this.setState({showInviteModal: true}); this.props.onModalDismissed(); }} > {content} this.setState({showInviteModal: false})} channel={this.props.channel} />
); } } ChannelMembersModal.defaultProps = { show: false }; ChannelMembersModal.propTypes = { show: React.PropTypes.bool.isRequired, onModalDismissed: React.PropTypes.func.isRequired, channel: React.PropTypes.object.isRequired };