// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import $ from 'jquery'; import ReactDOM from 'react-dom'; import * as Utils from 'utils/utils.jsx'; import * as Client from 'utils/client.jsx'; import Constants from 'utils/constants.jsx'; import {injectIntl, intlShape, defineMessages, FormattedMessage, FormattedHTMLMessage} from 'react-intl'; import logoImage from 'images/logo.png'; const holders = defineMessages({ required: { id: 'team_signup_url.required', defaultMessage: 'This field is required' }, regex: { id: 'team_signup_url.regex', defaultMessage: "Use only lower case letters, numbers and dashes. Must start with a letter and can't end in a dash." }, charLength: { id: 'team_signup_url.charLength', defaultMessage: 'Name must be 4 or more characters up to a maximum of 15' }, taken: { id: 'team_signup_url.taken', defaultMessage: 'URL is taken or contains a reserved word' }, unavailable: { id: 'team_signup_url.unavailable', defaultMessage: 'This URL is unavailable. Please try another.' } }); import React from 'react'; class TeamSignupUrlPage extends React.Component { constructor(props) { super(props); this.submitBack = this.submitBack.bind(this); this.submitNext = this.submitNext.bind(this); this.handleFocus = this.handleFocus.bind(this); this.state = {nameError: ''}; } submitBack(e) { e.preventDefault(); this.props.state.wizard = 'team_display_name'; this.props.updateParent(this.props.state); } submitNext(e) { e.preventDefault(); const {formatMessage} = this.props.intl; const name = ReactDOM.findDOMNode(this.refs.name).value.trim(); if (!name) { this.setState({nameError: formatMessage(holders.required)}); return; } const cleanedName = Utils.cleanUpUrlable(name); const urlRegex = /^[a-z]+([a-z\-0-9]+|(__)?)[a-z0-9]+$/g; if (cleanedName !== name || !urlRegex.test(name)) { this.setState({nameError: formatMessage(holders.regex)}); return; } else if (cleanedName.length < 4 || cleanedName.length > 15) { this.setState({nameError: formatMessage(holders.charLength)}); return; } if (global.window.mm_config.RestrictTeamNames === 'true') { for (let index = 0; index < Constants.RESERVED_TEAM_NAMES.length; index++) { if (cleanedName.indexOf(Constants.RESERVED_TEAM_NAMES[index]) === 0) { this.setState({nameError: formatMessage(holders.taken)}); return; } } } Client.findTeamByName(name, (data) => { if (data) { this.setState({nameError: formatMessage(holders.unavailable)}); } else { if (global.window.mm_config.SendEmailNotifications === 'true') { this.props.state.wizard = 'send_invites'; } else { this.props.state.wizard = 'username'; } this.props.state.team.type = 'O'; this.props.state.team.name = name; this.props.updateParent(this.props.state); } }, (err) => { this.setState({nameError: err.message}); } ); } handleFocus(e) { e.preventDefault(); e.currentTarget.select(); } render() { $('body').tooltip({selector: '[data-toggle=tooltip]', trigger: 'hover click'}); Client.track('signup', 'signup_team_03_url'); let nameError = null; let nameDivClass = 'form-group'; if (this.state.nameError) { nameError = ; nameDivClass += ' has-error'; } const title = `${Utils.getWindowLocationOrigin()}/`; return (

{title}
{nameError}

); } } TeamSignupUrlPage.propTypes = { intl: intlShape.isRequired, state: React.PropTypes.object, updateParent: React.PropTypes.func }; export default injectIntl(TeamSignupUrlPage);