// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import ReactDOM from 'react-dom'; import Constants from 'utils/constants.jsx'; import {Modal, Tooltip, OverlayTrigger} from 'react-bootstrap'; import TeamStore from 'stores/team_store.jsx'; import * as URL from 'utils/url.jsx'; import {FormattedMessage} from 'react-intl'; import React from 'react'; export default class ChangeUrlModal extends React.Component { constructor(props) { super(props); this.onURLChanged = this.onURLChanged.bind(this); this.doSubmit = this.doSubmit.bind(this); this.doCancel = this.doCancel.bind(this); this.state = { currentURL: props.currentURL, urlError: '', userEdit: false }; } componentWillReceiveProps(nextProps) { // This check prevents the url being deleted when we re-render // because of user status check if (!this.state.userEdit) { this.setState({ currentURL: nextProps.currentURL }); } } componentDidUpdate(prevProps) { if (this.props.show === true && prevProps.show === false) { ReactDOM.findDOMNode(this.refs.urlinput).select(); } } onURLChanged(e) { const url = e.target.value.trim(); this.setState({currentURL: url.replace(/[^A-Za-z0-9-_]/g, '').toLowerCase(), userEdit: true}); } getURLError(url) { let error = []; //eslint-disable-line prefer-const if (url.length < 2) { error.push(
); } if (url.charAt(0) === '-' || url.charAt(0) === '_') { error.push(
); } if (url.length > 1 && (url.charAt(url.length - 1) === '-' || url.charAt(url.length - 1) === '_')) { error.push(
); } if (url.indexOf('__') > -1) { error.push(
); } // In case of error we don't detect if (error.length === 0) { error.push(
); } return error; } doSubmit(e) { e.preventDefault(); const url = ReactDOM.findDOMNode(this.refs.urlinput).value; const cleanedURL = URL.cleanUpUrlable(url); if (cleanedURL !== url || url.length < 2 || url.indexOf('__') > -1) { this.setState({urlError: this.getURLError(url)}); return; } this.setState({urlError: '', userEdit: false}); this.props.onModalSubmit(url); } doCancel() { this.setState({urlError: '', userEdit: false}); this.props.onModalDismissed(); } render() { let urlClass = 'input-group input-group--limit'; let error = null; if (this.state.urlError) { urlClass += ' has-error'; } if (this.props.serverError || this.state.urlError) { error = (

{this.state.urlError || this.props.serverError}

); } const fullUrl = TeamStore.getCurrentTeamUrl() + '/channels'; const shortURL = URL.getShortenedURL(fullUrl); const urlTooltip = ( {fullUrl} ); return ( {this.props.title}
{shortURL}
{error}
); } } ChangeUrlModal.defaultProps = { show: false, title: 'Change URL', submitButtonText: 'Save', currentURL: '', serverError: null }; ChangeUrlModal.propTypes = { show: React.PropTypes.bool.isRequired, title: React.PropTypes.node, submitButtonText: React.PropTypes.node, currentURL: React.PropTypes.string, serverError: React.PropTypes.node, onModalSubmit: React.PropTypes.func.isRequired, onModalExited: React.PropTypes.func, onModalDismissed: React.PropTypes.func.isRequired };