summaryrefslogtreecommitdiffstats
path: root/webapp/components/integrations/components/edit_outgoing_webhook.jsx
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/components/integrations/components/edit_outgoing_webhook.jsx')
-rw-r--r--webapp/components/integrations/components/edit_outgoing_webhook.jsx190
1 files changed, 190 insertions, 0 deletions
diff --git a/webapp/components/integrations/components/edit_outgoing_webhook.jsx b/webapp/components/integrations/components/edit_outgoing_webhook.jsx
new file mode 100644
index 000000000..2268af923
--- /dev/null
+++ b/webapp/components/integrations/components/edit_outgoing_webhook.jsx
@@ -0,0 +1,190 @@
+// 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 = (
+ <FormattedMessage
+ id='update_outgoing_webhook.update'
+ defaultMessage='Update'
+ />
+ );
+
+ const confirmTitle = (
+ <FormattedMessage
+ id='update_outgoing_webhook.confirm'
+ defaultMessage='Edit Outgoing Webhook'
+ />
+ );
+
+ const confirmMessage = (
+ <FormattedMessage
+ id='update_outgoing_webhook.question'
+ defaultMessage='Your changes may break the existing outgoing webhook. Are you sure you would like to update it?'
+ />
+ );
+
+ return (
+ <ConfirmModal
+ title={confirmTitle}
+ message={confirmMessage}
+ confirmButton={confirmButton}
+ show={this.state.showConfirmModal}
+ onConfirm={this.handleUpdate}
+ onCancel={this.confirmModalDismissed}
+ />
+ );
+ }
+}