// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import MemberList from './member_list.jsx'; import LoadingScreen from './loading_screen.jsx'; import UserStore from '../stores/user_store.jsx'; import ChannelStore from '../stores/channel_store.jsx'; import * as Utils from '../utils/utils.jsx'; import * as Client from '../utils/client.jsx'; import * as AsyncClient from '../utils/async_client.jsx'; const Modal = ReactBootstrap.Modal; export default class ChannelInviteModal extends React.Component { constructor() { super(); this.onListenerChange = this.onListenerChange.bind(this); this.handleInvite = this.handleInvite.bind(this); this.state = this.getStateFromStores(); } shouldComponentUpdate(nextProps, nextState) { if (!Utils.areObjectsEqual(this.props, nextProps)) { return true; } if (!Utils.areObjectsEqual(this.state, nextState)) { return true; } return false; } getStateFromStores() { function getId(user) { return user.id; } var users = UserStore.getActiveOnlyProfiles(); var memberIds = ChannelStore.getCurrentExtraInfo().members.map(getId); var loading = $.isEmptyObject(users); var nonmembers = []; for (var id in users) { if (memberIds.indexOf(id) === -1) { nonmembers.push(users[id]); } } nonmembers.sort((a, b) => { return a.username.localeCompare(b.username); }); return { nonmembers, loading }; } onShow() { if ($(window).width() > 768) { $(ReactDOM.findDOMNode(this.refs.modalBody)).perfectScrollbar(); $(ReactDOM.findDOMNode(this.refs.modalBody)).css('max-height', $(window).height() - 200); } else { $(ReactDOM.findDOMNode(this.refs.modalBody)).css('max-height', $(window).height() - 150); } } componentDidUpdate(prevProps) { if (this.props.show && !prevProps.show) { this.onShow(); } } componentWillReceiveProps(nextProps) { if (!this.props.show && nextProps.show) { ChannelStore.addExtraInfoChangeListener(this.onListenerChange); ChannelStore.addChangeListener(this.onListenerChange); UserStore.addChangeListener(this.onListenerChange); this.onListenerChange(); } else if (this.props.show && !nextProps.show) { ChannelStore.removeExtraInfoChangeListener(this.onListenerChange); ChannelStore.removeChangeListener(this.onListenerChange); UserStore.removeChangeListener(this.onListenerChange); } } onListenerChange() { var newState = this.getStateFromStores(); if (!Utils.areObjectsEqual(this.state, newState)) { this.setState(newState); } } handleInvite(userId) { var data = {}; data.user_id = userId; Client.addChannelMember( this.props.channel.id, data, () => { this.setState({inviteError: null}); AsyncClient.getChannelExtraInfo(); }, (err) => { this.setState({inviteError: err.message}); } ); } render() { var inviteError = null; if (this.state.inviteError) { inviteError = (); } var currentMember = ChannelStore.getCurrentMember(); var isAdmin = false; if (currentMember) { isAdmin = Utils.isAdmin(currentMember.roles) || Utils.isAdmin(UserStore.getCurrentUser().roles); } var content; if (this.state.loading) { content = (); } else { content = ( ); } return ( {'Add New Members to '}{this.props.channel.display_name} {inviteError} {content} ); } } ChannelInviteModal.propTypes = { show: React.PropTypes.bool.isRequired, onHide: React.PropTypes.func.isRequired, channel: React.PropTypes.object.isRequired };