import PropTypes from 'prop-types'; // Copyright (c) 2016-present Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import React from 'react'; import * as AsyncClient from 'utils/async_client.jsx'; import * as Utils from 'utils/utils.jsx'; import BackstageHeader from 'components/backstage/components/backstage_header.jsx'; import {FormattedMessage} from 'react-intl'; import FormError from 'components/form_error.jsx'; import {browserHistory, Link} from 'react-router/es6'; import SpinnerButton from 'components/spinner_button.jsx'; import Constants from 'utils/constants.jsx'; const REQUEST_POST = 'P'; const REQUEST_GET = 'G'; export default class AddCommand extends React.Component { static get propTypes() { return { team: 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.updateTrigger = this.updateTrigger.bind(this); this.updateUrl = this.updateUrl.bind(this); this.updateMethod = this.updateMethod.bind(this); this.updateUsername = this.updateUsername.bind(this); this.updateIconUrl = this.updateIconUrl.bind(this); this.updateAutocomplete = this.updateAutocomplete.bind(this); this.updateAutocompleteHint = this.updateAutocompleteHint.bind(this); this.updateAutocompleteDescription = this.updateAutocompleteDescription.bind(this); this.state = { displayName: '', description: '', trigger: '', url: '', method: REQUEST_POST, username: '', iconUrl: '', autocomplete: false, autocompleteHint: '', autocompleteDescription: '', saving: false, serverError: '', clientError: null }; } handleSubmit(e) { e.preventDefault(); if (this.state.saving) { return; } this.setState({ saving: true, serverError: '', clientError: '' }); let triggerWord = this.state.trigger.trim().toLowerCase(); if (triggerWord.indexOf('/') === 0) { triggerWord = triggerWord.substr(1); } const command = { display_name: this.state.displayName, description: this.state.description, trigger: triggerWord, url: this.state.url.trim(), method: this.state.method, username: this.state.username, icon_url: this.state.iconUrl, auto_complete: this.state.autocomplete }; if (command.auto_complete) { command.auto_complete_desc = this.state.autocompleteDescription; command.auto_complete_hint = this.state.autocompleteHint; } if (!command.trigger) { this.setState({ saving: false, clientError: ( ) }); return; } if (command.trigger.indexOf('/') === 0) { this.setState({ saving: false, clientError: ( ) }); return; } if (command.trigger.indexOf(' ') !== -1) { this.setState({ saving: false, clientError: ( ) }); return; } if (command.trigger.length < Constants.MIN_TRIGGER_LENGTH || command.trigger.length > Constants.MAX_TRIGGER_LENGTH) { this.setState({ saving: false, clientError: ( ) }); return; } if (!command.url) { this.setState({ saving: false, clientError: ( ) }); return; } AsyncClient.addCommand( command, (data) => { browserHistory.push('/' + this.props.team.name + '/integrations/commands/confirm?type=commands&id=' + data.id); }, (err) => { this.setState({ saving: false, serverError: err.message }); } ); } updateDisplayName(e) { this.setState({ displayName: e.target.value }); } updateDescription(e) { this.setState({ description: e.target.value }); } updateTrigger(e) { this.setState({ trigger: e.target.value }); } updateUrl(e) { this.setState({ url: e.target.value }); } updateMethod(e) { this.setState({ method: e.target.value }); } updateUsername(e) { this.setState({ username: e.target.value }); } updateIconUrl(e) { this.setState({ iconUrl: e.target.value }); } updateAutocomplete(e) { this.setState({ autocomplete: e.target.checked }); } updateAutocompleteHint(e) { this.setState({ autocompleteHint: e.target.value }); } updateAutocompleteDescription(e) { this.setState({ autocompleteDescription: e.target.value }); } render() { let autocompleteFields = null; if (this.state.autocomplete) { autocompleteFields = [(
), (
)]; } return (
) }} />
{autocompleteFields}
); } }