From 12896bd23eeba79884245c1c29fdc568cf21a7fa Mon Sep 17 00:00:00 2001 From: Christopher Speller Date: Mon, 14 Mar 2016 08:50:46 -0400 Subject: Converting to Webpack. Stage 1. --- webapp/components/channel_members_modal.jsx | 225 ++++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 webapp/components/channel_members_modal.jsx (limited to 'webapp/components/channel_members_modal.jsx') diff --git a/webapp/components/channel_members_modal.jsx b/webapp/components/channel_members_modal.jsx new file mode 100644 index 000000000..67be2ef50 --- /dev/null +++ b/webapp/components/channel_members_modal.jsx @@ -0,0 +1,225 @@ +// 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 +}; -- cgit v1.2.3-1-g7c22