// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import BackstageList from 'components/backstage/components/backstage_list.jsx'; import InstalledIncomingWebhook from './installed_incoming_webhook.jsx'; import ChannelStore from 'stores/channel_store.jsx'; import IntegrationStore from 'stores/integration_store.jsx'; import TeamStore from 'stores/team_store.jsx'; import UserStore from 'stores/user_store.jsx'; import {loadIncomingHooks} from 'actions/integration_actions.jsx'; import * as AsyncClient from 'utils/async_client.jsx'; import * as Utils from 'utils/utils.jsx'; import React from 'react'; import {FormattedMessage} from 'react-intl'; export default class InstalledIncomingWebhooks extends React.Component { static get propTypes() { return { team: React.PropTypes.object, user: React.PropTypes.object, isAdmin: React.PropTypes.bool }; } constructor(props) { super(props); this.handleIntegrationChange = this.handleIntegrationChange.bind(this); this.handleUserChange = this.handleUserChange.bind(this); this.deleteIncomingWebhook = this.deleteIncomingWebhook.bind(this); const teamId = TeamStore.getCurrentId(); this.state = { incomingWebhooks: IntegrationStore.getIncomingWebhooks(teamId), loading: !IntegrationStore.hasReceivedIncomingWebhooks(teamId), users: UserStore.getProfiles() }; } componentDidMount() { IntegrationStore.addChangeListener(this.handleIntegrationChange); UserStore.addChangeListener(this.handleUserChange); if (window.mm_config.EnableIncomingWebhooks === 'true') { loadIncomingHooks(); } } componentWillUnmount() { IntegrationStore.removeChangeListener(this.handleIntegrationChange); UserStore.removeChangeListener(this.handleUserChange); } handleIntegrationChange() { const teamId = TeamStore.getCurrentId(); this.setState({ incomingWebhooks: IntegrationStore.getIncomingWebhooks(teamId), loading: !IntegrationStore.hasReceivedIncomingWebhooks(teamId) }); } handleUserChange() { this.setState({ users: UserStore.getProfiles() }); } deleteIncomingWebhook(incomingWebhook) { AsyncClient.deleteIncomingHook(incomingWebhook.id); } incomingWebhookCompare(a, b) { let displayNameA = a.display_name; if (!displayNameA) { const channelA = ChannelStore.get(a.channel_id); if (channelA) { displayNameA = channelA.display_name; } else { displayNameA = Utils.localizeMessage('installed_incoming_webhooks.unknown_channel', 'A Private Webhook'); } } let displayNameB = b.display_name; if (!displayNameB) { const channelB = ChannelStore.get(b.channel_id); if (channelB) { displayNameB = channelB.display_name; } else { displayNameB = Utils.localizeMessage('installed_incoming_webhooks.unknown_channel', 'A Private Webhook'); } } return displayNameA.localeCompare(displayNameB); } render() { const incomingWebhooks = this.state.incomingWebhooks.sort(this.incomingWebhookCompare).map((incomingWebhook) => { const canChange = this.props.isAdmin || this.props.user.id === incomingWebhook.user_id; return ( ); }); return ( } addText={ } addLink={'/' + this.props.team.name + '/integrations/incoming_webhooks/add'} emptyText={ } helpText={ ) }} /> } searchPlaceholder={Utils.localizeMessage('installed_incoming_webhooks.search', 'Search Incoming Webhooks')} loading={this.state.loading} > {incomingWebhooks} ); } }