summaryrefslogtreecommitdiffstats
path: root/webapp/components/more_channels.jsx
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/components/more_channels.jsx')
-rw-r--r--webapp/components/more_channels.jsx233
1 files changed, 233 insertions, 0 deletions
diff --git a/webapp/components/more_channels.jsx b/webapp/components/more_channels.jsx
new file mode 100644
index 000000000..fc047eaff
--- /dev/null
+++ b/webapp/components/more_channels.jsx
@@ -0,0 +1,233 @@
+// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+import $ from 'jquery';
+import ReactDOM from 'react-dom';
+import * as Utils from 'utils/utils.jsx';
+import * as client from 'utils/client.jsx';
+import * as AsyncClient from 'utils/async_client.jsx';
+import ChannelStore from 'stores/channel_store.jsx';
+import LoadingScreen from './loading_screen.jsx';
+import NewChannelFlow from './new_channel_flow.jsx';
+
+import {FormattedMessage} from 'react-intl';
+
+import loadingGif from 'images/load.gif';
+
+function getStateFromStores() {
+ return {
+ channels: ChannelStore.getMoreAll(),
+ serverError: null
+ };
+}
+
+import React from 'react';
+
+export default class MoreChannels extends React.Component {
+ constructor(props) {
+ super(props);
+
+ this.onListenerChange = this.onListenerChange.bind(this);
+ this.handleJoin = this.handleJoin.bind(this);
+ this.handleNewChannel = this.handleNewChannel.bind(this);
+ this.createChannelRow = this.createChannelRow.bind(this);
+
+ var initState = getStateFromStores();
+ initState.channelType = '';
+ initState.joiningChannel = -1;
+ initState.showNewChannelModal = false;
+ this.state = initState;
+ }
+ componentDidMount() {
+ ChannelStore.addMoreChangeListener(this.onListenerChange);
+ $(ReactDOM.findDOMNode(this.refs.modal)).on('shown.bs.modal', () => {
+ AsyncClient.getMoreChannels(true);
+ });
+
+ var self = this;
+ $(ReactDOM.findDOMNode(this.refs.modal)).on('show.bs.modal', (e) => {
+ var button = e.relatedTarget;
+ self.setState({channelType: $(button).attr('data-channeltype')});
+ });
+ }
+ componentWillUnmount() {
+ ChannelStore.removeMoreChangeListener(this.onListenerChange);
+ }
+ onListenerChange() {
+ var newState = getStateFromStores();
+ if (!Utils.areObjectsEqual(newState.channels, this.state.channels)) {
+ this.setState(newState);
+ }
+ }
+ handleJoin(channel, channelIndex) {
+ this.setState({joiningChannel: channelIndex});
+ client.joinChannel(channel.id,
+ () => {
+ $(ReactDOM.findDOMNode(this.refs.modal)).modal('hide');
+ AsyncClient.getChannel(channel.id);
+ Utils.switchChannel(channel);
+ this.setState({joiningChannel: -1});
+ },
+ (err) => {
+ this.setState({joiningChannel: -1, serverError: err.message});
+ }
+ );
+ }
+ handleNewChannel() {
+ $(ReactDOM.findDOMNode(this.refs.modal)).modal('hide');
+ this.setState({showNewChannelModal: true});
+ }
+ createChannelRow(channel, index) {
+ let joinButton;
+ if (this.state.joiningChannel === index) {
+ joinButton = (
+ <img
+ className='join-channel-loading-gif'
+ src={loadingGif}
+ />
+ );
+ } else {
+ joinButton = (
+ <button
+ onClick={this.handleJoin.bind(self, channel, index)}
+ className='btn btn-primary'
+ >
+ <FormattedMessage
+ id='more_channels.join'
+ defaultMessage='Join'
+ />
+ </button>
+ );
+ }
+
+ return (
+ <div
+ className='more-modal__row'
+ key={channel.id}
+ >
+ <div className='more-modal__details'>
+ <p className='more-modal__name'>{channel.display_name}</p>
+ <p className='more-modal__description'>{channel.purpose}</p>
+ </div>
+ <div className='more-modal__actions'>
+ {joinButton}
+ </div>
+ </div>
+ );
+ }
+ render() {
+ let maxHeight = 1000;
+ if (Utils.windowHeight() <= 1200) {
+ maxHeight = Utils.windowHeight() - 300;
+ }
+
+ var serverError;
+ if (this.state.serverError) {
+ serverError = <div className='form-group has-error'><label className='control-label'>{this.state.serverError}</label></div>;
+ }
+
+ var moreChannels;
+
+ if (this.state.channels != null) {
+ var channels = this.state.channels;
+ if (channels.loading) {
+ moreChannels = <LoadingScreen/>;
+ } else if (channels.length) {
+ moreChannels = (
+ <div className='more-modal__list'>
+ {channels.map(this.createChannelRow)}
+ </div>
+ );
+ } else {
+ moreChannels = (
+ <div className='no-channel-message'>
+ <p className='primary-message'>
+ <FormattedMessage
+ id='more_channels.noMore'
+ defaultMessage='No more channels to join'
+ />
+ </p>
+ <p className='secondary-message'>
+ <FormattedMessage
+ id='more_channels.createClick'
+ defaultMessage="Click 'Create New Channel' to make a new one"
+ />
+ </p>
+ </div>
+ );
+ }
+ }
+
+ return (
+ <div
+ className='modal fade'
+ id='more_channels'
+ ref='modal'
+ tabIndex='-1'
+ role='dialog'
+ aria-hidden='true'
+ >
+ <div className='modal-dialog'>
+ <div className='modal-content'>
+ <div className='modal-header'>
+ <button
+ type='button'
+ className='close'
+ data-dismiss='modal'
+ >
+ <span aria-hidden='true'>{'×'}</span>
+ <span className='sr-only'>
+ <FormattedMessage
+ id='more_channels.close'
+ defaultMessage='Close'
+ />
+ </span>
+ </button>
+ <h4 className='modal-title'>
+ <FormattedMessage
+ id='more_channels.title'
+ defaultMessage='More Channels'
+ />
+ </h4>
+ <button
+ type='button'
+ className='btn btn-primary channel-create-btn'
+ onClick={this.handleNewChannel}
+ >
+ <FormattedMessage
+ id='more_channels.create'
+ defaultMessage='Create New Channel'
+ />
+ </button>
+ <NewChannelFlow
+ show={this.state.showNewChannelModal}
+ channelType={this.state.channelType}
+ onModalDismissed={() => this.setState({showNewChannelModal: false})}
+ />
+ </div>
+ <div
+ className='modal-body'
+ style={{maxHeight}}
+ >
+ {moreChannels}
+ {serverError}
+ </div>
+ <div className='modal-footer'>
+ <button
+ type='button'
+ className='btn btn-default'
+ data-dismiss='modal'
+ >
+ <FormattedMessage
+ id='more_channels.close'
+ defaultMessage='Close'
+ />
+ </button>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ );
+ }
+}