// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. const UserStore = require('../stores/user_store.jsx'); const ChannelStore = require('../stores/channel_store.jsx'); const AsyncClient = require('../utils/async_client.jsx'); const MemberList = require('./member_list.jsx'); const Client = require('../utils/client.jsx'); const Utils = require('../utils/utils.jsx'); export default class ChannelMembers 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.onHide = this.onHide.bind(this); this.onShow = this.onShow.bind(this); this.state = this.getStateFromStores(); } getStateFromStores() { const users = UserStore.getActiveOnlyProfiles(); let memberList = ChannelStore.getCurrentExtraInfo().members; let nonmemberList = []; for (let id in users) { if (users.hasOwnProperty(id)) { let found = false; for (let i = 0; i < memberList.length; i++) { if (memberList[i].id === id) { found = true; break; } } if (!found) { nonmemberList.push(users[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); nonmemberList.sort(compareByUsername); const channel = ChannelStore.getCurrent(); let channelName = ''; if (channel) { channelName = channel.display_name; } return { nonmemberList: nonmemberList, memberList: memberList, channelName: channelName }; } onHide() { this.setState({renderMembers: false}); } onShow() { this.setState({renderMembers: true}); } componentDidMount() { ChannelStore.addExtraInfoChangeListener(this.onChange); ChannelStore.addChangeListener(this.onChange); $(React.findDOMNode(this.refs.modal)).on('hidden.bs.modal', this.onHide); $(React.findDOMNode(this.refs.modal)).on('show.bs.modal', this.onShow); } componentWillUnmount() { ChannelStore.removeExtraInfoChangeListener(this.onChange); ChannelStore.removeChangeListener(this.onChange); } onChange() { const newState = this.getStateFromStores(); if (!Utils.areStatesEqual(this.state, newState)) { this.setState(newState); } } handleRemove(userId) { // Make sure the user is a member of the channel let memberList = this.state.memberList; let found = false; for (let i = 0; i < memberList.length; i++) { if (memberList[i].id === userId) { found = true; break; } } if (!found) { return; } let data = {}; data.user_id = userId; Client.removeChannelMember(ChannelStore.getCurrentId(), data, function handleRemoveSuccess() { let oldMember; for (let i = 0; i < memberList.length; i++) { if (userId === memberList[i].id) { oldMember = memberList[i]; memberList.splice(i, 1); break; } } let nonmemberList = this.state.nonmemberList; if (oldMember) { nonmemberList.push(oldMember); } this.setState({memberList: memberList, nonmemberList: nonmemberList}); AsyncClient.getChannelExtraInfo(true); }.bind(this), function handleRemoveError(err) { this.setState({inviteError: err.message}); }.bind(this) ); } render() { const currentMember = ChannelStore.getCurrentMember(); let isAdmin = false; if (currentMember) { isAdmin = Utils.isAdmin(currentMember.roles) || Utils.isAdmin(UserStore.getCurrentUser().roles); } var memberList = null; if (this.state.renderMembers) { memberList = ( ); } return ( ); } }