// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import React from 'react'; import * as AsyncClient from 'utils/async_client.jsx'; import ChannelStore from 'stores/channel_store.jsx'; import IntegrationStore from 'stores/integration_store.jsx'; import * as Utils from 'utils/utils.jsx'; import {FormattedMessage} from 'react-intl'; import {Link} from 'react-router'; export default class InstalledIntegrations extends React.Component { constructor(props) { super(props); this.handleChange = this.handleChange.bind(this); this.setFilter = this.setFilter.bind(this); this.state = { incomingWebhooks: [], outgoingWebhooks: [], filter: '' }; } componentWillMount() { IntegrationStore.addChangeListener(this.handleChange); if (window.mm_config.EnableIncomingWebhooks === 'true') { if (IntegrationStore.hasReceivedIncomingWebhooks()) { this.setState({ incomingWebhooks: IntegrationStore.getIncomingWebhooks() }); } else { AsyncClient.listIncomingHooks(); } } if (window.mm_config.EnableOutgoingWebhooks === 'true') { if (IntegrationStore.hasReceivedOutgoingWebhooks()) { this.setState({ outgoingWebhooks: IntegrationStore.getOutgoingWebhooks() }); } else { AsyncClient.listOutgoingHooks(); } } } componentWillUnmount() { IntegrationStore.removeChangeListener(this.handleChange); } handleChange() { this.setState({ incomingWebhooks: IntegrationStore.getIncomingWebhooks(), outgoingWebhooks: IntegrationStore.getOutgoingWebhooks() }); } setFilter(e, filter) { e.preventDefault(); this.setState({ filter }); } renderTypeFilters(incomingWebhooks, outgoingWebhooks) { const fields = []; if (incomingWebhooks.length > 0 || outgoingWebhooks.length > 0) { let filterClassName = 'type-filter'; if (this.state.filter === '') { filterClassName += ' type-filter--selected'; } fields.push( this.setFilter(e, '')} > ); } if (incomingWebhooks.length > 0) { fields.push( {'|'} ); let filterClassName = 'type-filter'; if (this.state.filter === 'incomingWebhooks') { filterClassName += ' type-filter--selected'; } fields.push( this.setFilter(e, 'incomingWebhooks')} > ); } if (outgoingWebhooks.length > 0) { fields.push( {'|'} ); let filterClassName = 'type-filter'; if (this.state.filter === 'outgoingWebhooks') { filterClassName += ' type-filter--selected'; } fields.push( this.setFilter(e, 'outgoingWebhooks')} > ); } return (
{fields}
); } render() { const incomingWebhooks = this.state.incomingWebhooks; const outgoingWebhooks = this.state.outgoingWebhooks; const integrations = []; if (!this.state.filter || this.state.filter === 'incomingWebhooks') { for (const incomingWebhook of incomingWebhooks) { integrations.push( ); } } if (!this.state.filter || this.state.filter === 'outgoingWebhooks') { for (const outgoingWebhook of outgoingWebhooks) { integrations.push( ); } } return (

{this.renderTypeFilters(this.state.incomingWebhooks, this.state.outgoingWebhooks)}
{integrations}
); } } function IncomingWebhook({incomingWebhook}) { const channel = ChannelStore.get(incomingWebhook.channel_id); const channelName = channel ? channel.display_name : 'cannot find channel'; return (
{channelName}
{Utils.getWindowLocationOrigin() + '/hooks/' + incomingWebhook.id}
); } IncomingWebhook.propTypes = { incomingWebhook: React.PropTypes.object.isRequired }; function OutgoingWebhook({outgoingWebhook}) { const channel = ChannelStore.get(outgoingWebhook.channel_id); const channelName = channel ? channel.display_name : 'cannot find channel'; return (
{channelName}
{Utils.getWindowLocationOrigin() + '/hooks/' + outgoingWebhook.id}
); } OutgoingWebhook.propTypes = { outgoingWebhook: React.PropTypes.object.isRequired };