// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import React from 'react'; import {localizeMessage} from 'utils/utils.jsx'; import BackstageHeader from 'components/backstage/components/backstage_header.jsx'; import ChannelSelect from 'components/channel_select.jsx'; import {FormattedMessage} from 'react-intl'; import FormError from 'components/form_error.jsx'; import {Link} from 'react-router/es6'; import SpinnerButton from 'components/spinner_button.jsx'; export default class AbstractOutgoingWebhook extends React.Component { static get propTypes() { return { team: React.PropTypes.object }; } constructor(props) { super(props); this.handleSubmit = this.handleSubmit.bind(this); this.updateDisplayName = this.updateDisplayName.bind(this); this.updateDescription = this.updateDescription.bind(this); this.updateContentType = this.updateContentType.bind(this); this.updateChannelId = this.updateChannelId.bind(this); this.updateTriggerWords = this.updateTriggerWords.bind(this); this.updateTriggerWhen = this.updateTriggerWhen.bind(this); this.updateCallbackUrls = this.updateCallbackUrls.bind(this); this.state = { displayName: '', description: '', contentType: 'application/x-www-form-urlencoded', channelId: '', triggerWords: '', triggerWhen: 0, callbackUrls: '', saving: false, serverError: '', clientError: null }; if (typeof this.performAction === 'undefined') { throw new TypeError('Subclasses must override performAction'); } if (typeof this.header === 'undefined') { throw new TypeError('Subclasses must override header'); } if (typeof this.footer === 'undefined') { throw new TypeError('Subclasses must override footer'); } if (typeof this.renderExtra === 'undefined') { throw new TypeError('Subclasses must override renderExtra'); } this.performAction = this.performAction.bind(this); this.header = this.header.bind(this); this.footer = this.footer.bind(this); this.renderExtra = this.renderExtra.bind(this); } handleSubmit(e) { e.preventDefault(); if (this.state.saving) { return; } this.setState({ saving: true, serverError: '', clientError: '' }); const triggerWords = []; if (this.state.triggerWords) { for (let triggerWord of this.state.triggerWords.split('\n')) { triggerWord = triggerWord.trim(); if (triggerWord.length > 0) { triggerWords.push(triggerWord); } } } if (!this.state.channelId && triggerWords.length === 0) { this.setState({ saving: false, clientError: ( ) }); return; } const callbackUrls = []; for (let callbackUrl of this.state.callbackUrls.split('\n')) { callbackUrl = callbackUrl.trim(); if (callbackUrl.length > 0) { callbackUrls.push(callbackUrl); } } if (callbackUrls.length === 0) { this.setState({ saving: false, clientError: ( ) }); return; } const hook = { channel_id: this.state.channelId, trigger_words: triggerWords, trigger_when: parseInt(this.state.triggerWhen, 10), callback_urls: callbackUrls, display_name: this.state.displayName, content_type: this.state.contentType, description: this.state.description }; this.performAction(hook); } updateDisplayName(e) { this.setState({ displayName: e.target.value }); } updateDescription(e) { this.setState({ description: e.target.value }); } updateContentType(e) { this.setState({ contentType: e.target.value }); } updateChannelId(e) { this.setState({ channelId: e.target.value }); } updateTriggerWords(e) { this.setState({ triggerWords: e.target.value }); } updateTriggerWhen(e) { this.setState({ triggerWhen: e.target.value }); } updateCallbackUrls(e) { this.setState({ callbackUrls: e.target.value }); } render() { const contentTypeOption1 = 'application/x-www-form-urlencoded'; const contentTypeOption2 = 'application/json'; var headerToRender = this.header(); var footerToRender = this.footer(); var renderExtra = this.renderExtra(); return (