// 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 {browserHistory} from 'react-router/es6'; import IntegrationStore from 'stores/integration_store.jsx'; import {loadOutgoingHooks} from 'actions/integration_actions.jsx'; import AbstractOutgoingWebhook from './abstract_outgoing_webhook.jsx'; import ConfirmModal from 'components/confirm_modal.jsx'; import {FormattedMessage} from 'react-intl'; import TeamStore from 'stores/team_store.jsx'; export default class EditOutgoingWebhook extends AbstractOutgoingWebhook { constructor(props) { super(props); this.handleIntegrationChange = this.handleIntegrationChange.bind(this); this.handleConfirmModal = this.handleConfirmModal.bind(this); this.handleUpdate = this.handleUpdate.bind(this); this.submitCommand = this.submitCommand.bind(this); this.confirmModalDismissed = this.confirmModalDismissed.bind(this); this.originalOutgoingHook = null; this.state = { showConfirmModal: false }; } componentDidMount() { IntegrationStore.addChangeListener(this.handleIntegrationChange); if (window.mm_config.EnableOutgoingWebhooks === 'true') { loadOutgoingHooks(); } } componentWillUnmount() { IntegrationStore.removeChangeListener(this.handleIntegrationChange); } handleIntegrationChange() { const teamId = TeamStore.getCurrentId(); this.setState({ hooks: IntegrationStore.getOutgoingWebhooks(teamId), loading: !IntegrationStore.hasReceivedOutgoingWebhooks(teamId) }); if (!this.state.loading) { this.originalOutgoingHook = this.state.hooks.filter((hook) => hook.id === this.props.location.query.id)[0]; this.setState({ displayName: this.originalOutgoingHook.display_name, description: this.originalOutgoingHook.description, channelId: this.originalOutgoingHook.channel_id, contentType: this.originalOutgoingHook.content_type, triggerWhen: this.originalOutgoingHook.trigger_when }); var triggerWords = ''; if (this.originalOutgoingHook.trigger_words) { let i = 0; for (i = 0; i < this.originalOutgoingHook.trigger_words.length; i++) { triggerWords += this.originalOutgoingHook.trigger_words[i] + '\n'; } } var callbackUrls = ''; if (this.originalOutgoingHook.callback_urls) { let i = 0; for (i = 0; i < this.originalOutgoingHook.callback_urls.length; i++) { callbackUrls += this.originalOutgoingHook.callback_urls[i] + '\n'; } } this.setState({ triggerWords, callbackUrls }); } } performAction(hook) { this.newHook = hook; if (this.originalOutgoingHook.id) { hook.id = this.originalOutgoingHook.id; } if (this.originalOutgoingHook.token) { hook.token = this.originalOutgoingHook.token; } var triggerWordsSame = (this.originalOutgoingHook.trigger_words.length === hook.trigger_words.length) && this.originalOutgoingHook.trigger_words.every((v, i) => v === hook.trigger_words[i]); var callbackUrlsSame = (this.originalOutgoingHook.callback_urls.length === hook.callback_urls.length) && this.originalOutgoingHook.callback_urls.every((v, i) => v === hook.callback_urls[i]); if (this.originalOutgoingHook.content_type !== hook.content_type || !triggerWordsSame || !callbackUrlsSame) { this.handleConfirmModal(); this.setState({ saving: false }); } else { this.submitCommand(); } } handleUpdate() { this.setState({ saving: true, serverError: '', clientError: '' }); this.submitCommand(); } handleConfirmModal() { this.setState({showConfirmModal: true}); } confirmModalDismissed() { this.setState({showConfirmModal: false}); } submitCommand() { AsyncClient.updateOutgoingHook( this.newHook, () => { browserHistory.push(`/${this.props.team.name}/integrations/outgoing_webhooks`); }, (err) => { this.setState({ saving: false, showConfirmModal: false, serverError: err.message }); } ); } header() { return {id: 'integrations.edit', defaultMessage: 'Edit'}; } footer() { return {id: 'update_outgoing_webhook.update', defaultMessage: 'Update'}; } renderExtra() { const confirmButton = ( ); const confirmTitle = ( ); const confirmMessage = ( ); return ( ); } }