// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import $ from 'jquery'; import ReactDOM from 'react-dom'; import * as UserAgent from 'utils/user_agent.jsx'; import {localizeMessage} from 'utils/utils.jsx'; import {FormattedMessage} from 'react-intl'; import React from 'react'; import loadingGif from 'images/load.gif'; export default class FilteredChannelList extends React.Component { constructor(props) { super(props); this.handleFilterChange = this.handleFilterChange.bind(this); this.createChannelRow = this.createChannelRow.bind(this); this.filterChannels = this.filterChannels.bind(this); this.state = { filter: '', joiningChannel: '', channels: this.filterChannels(props.channels) }; } componentWillReceiveProps(nextProps) { // assume the channel list is immutable if (this.props.channels !== nextProps.channels) { this.setState({ channels: this.filterChannels(nextProps.channels) }); } } componentDidMount() { // only focus the search box on desktop so that we don't cause the keyboard to open on mobile if (!UserAgent.isMobile()) { ReactDOM.findDOMNode(this.refs.filter).focus(); } } componentDidUpdate(prevProps, prevState) { if (prevState.filter !== this.state.filter) { $(ReactDOM.findDOMNode(this.refs.channelList)).scrollTop(0); } } handleJoin(channel) { this.setState({joiningChannel: channel.id}); this.props.handleJoin( channel, () => { this.setState({joiningChannel: ''}); }); } createChannelRow(channel) { let joinButton; if (this.state.joiningChannel === channel.id) { joinButton = ( ); } else { joinButton = ( ); } return (

{channel.display_name}

{channel.purpose}

{joinButton}
); } filterChannels(channels) { if (!this.state || !this.state.filter) { return channels; } return channels.filter((chan) => { const filter = this.state.filter.toLowerCase(); return Boolean((chan.name.toLowerCase().indexOf(filter) !== -1 || chan.display_name.toLowerCase().indexOf(filter) !== -1) && chan.delete_at === 0); }); } handleFilterChange(e) { this.setState({ filter: e.target.value }); } render() { let channels = this.state.channels; if (this.state.filter && this.state.filter.length > 0) { channels = this.filterChannels(channels); } let count; if (channels.length === this.props.channels.length) { count = ( ); } else { count = ( ); } return (
{count}
{channels.map(this.createChannelRow)}
); } } FilteredChannelList.defaultProps = { channels: [] }; FilteredChannelList.propTypes = { channels: React.PropTypes.arrayOf(React.PropTypes.object), handleJoin: React.PropTypes.func.isRequired };