// Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import React from 'react'; import PropTypes from 'prop-types'; import TeamStore from 'stores/team_store.jsx'; 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 propTypes = { /** * The current team */ team: PropTypes.object.isRequired, /** * The header text to render, has id and defaultMessage */ header: PropTypes.object.isRequired, /** * The footer text to render, has id and defaultMessage */ footer: PropTypes.object.isRequired, /** * Any extra component/node to render */ renderExtra: PropTypes.node.isRequired, /** * The server error text after a failed action */ serverError: PropTypes.string.isRequired, /** * The hook used to set the initial state */ initialHook: PropTypes.object, /** * The async function to run when the action button is pressed */ action: PropTypes.func.isRequired } constructor(props) { super(props); this.state = this.getStateFromHook(this.props.initialHook || {}); } getStateFromHook = (hook) => { let triggerWords = ''; if (hook.trigger_words) { let i = 0; for (i = 0; i < hook.trigger_words.length; i++) { triggerWords += hook.trigger_words[i] + '\n'; } } let callbackUrls = ''; if (hook.callback_urls) { let i = 0; for (i = 0; i < hook.callback_urls.length; i++) { callbackUrls += hook.callback_urls[i] + '\n'; } } return { displayName: hook.display_name || '', description: hook.description || '', contentType: hook.content_type || 'application/x-www-form-urlencoded', channelId: hook.channel_id || '', triggerWords, triggerWhen: hook.trigger_when || 0, callbackUrls, saving: false, clientError: null }; } handleSubmit = (e) => { e.preventDefault(); if (this.state.saving) { return; } this.setState({ saving: true, 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 = { team_id: TeamStore.getCurrentId(), 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.props.action(hook).then(() => this.setState({saving: false})); } 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.props.header; var footerToRender = this.props.footer; var renderExtra = this.props.renderExtra; return (