// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import PropTypes from 'prop-types';
import React from 'react';
import {FormattedMessage} from 'react-intl';
import {Link} from 'react-router-dom';
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 FormError from 'components/form_error.jsx';
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,
/**
* Whether to allow configuration of the default post username.
*/
enablePostUsernameOverride: PropTypes.bool.isRequired,
/**
* Whether to allow configuration of the default post icon.
*/
enablePostIconOverride: PropTypes.bool.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,
username: hook.username || '',
iconURL: hook.icon_url || '',
};
}
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: (