// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import LoadingScreen from 'components/loading_screen.jsx'; import LoginLdap from 'components/login/components/login_ldap.jsx'; import * as GlobalActions from 'action_creators/global_actions.jsx'; import BrowserStore from 'stores/browser_store.jsx'; import UserStore from 'stores/user_store.jsx'; import * as Utils from 'utils/utils.jsx'; import Client from 'utils/web_client.jsx'; import Constants from 'utils/constants.jsx'; import {FormattedMessage, FormattedHTMLMessage} from 'react-intl'; import {browserHistory, Link} from 'react-router'; import React from 'react'; import ReactDOM from 'react-dom'; import logoImage from 'images/logo.png'; class SignupUserComplete extends React.Component { constructor(props) { super(props); this.handleSubmit = this.handleSubmit.bind(this); this.handleLdapSignup = this.handleLdapSignup.bind(this); this.state = { data: '', hash: '', usedBefore: false, email: '', teamDisplayName: '', teamName: '', teamId: '', openServer: false, loading: true, inviteId: '' }; } componentWillMount() { let data = this.props.location.query.d; let hash = this.props.location.query.h; const inviteId = this.props.location.query.id; let usedBefore = false; let email = ''; let teamDisplayName = ''; let teamName = ''; let teamId = ''; let openServer = false; let loading = true; if ((inviteId && inviteId.length > 0) || (hash && hash.length > 0)) { // if we are already logged in then attempt to just join the team if (UserStore.getCurrentUser()) { loading = true; Client.addUserToTeamFromInvite( data, hash, inviteId, () => { GlobalActions.emitInitialLoad( () => { browserHistory.push('/select_team'); } ); }, (err) => { this.setState({ noOpenServerError: true, serverError: err.message, loading: false }); } ); } else if (hash) { // If we have a hash in the url then we are attempting to access a private team const parsedData = JSON.parse(data); usedBefore = BrowserStore.getGlobalItem(hash); email = parsedData.email; teamDisplayName = parsedData.display_name; teamName = parsedData.name; teamId = parsedData.id; loading = false; } else { loading = true; Client.getInviteInfo( inviteId, (inviteData) => { if (!inviteData) { return; } this.setState({ serverError: null, teamDisplayName: inviteData.display_name, teamName: inviteData.name, teamId: inviteData.id, loading: false }); }, () => { this.setState({ noOpenServerError: true, loading: false, serverError: }); } ); data = ''; hash = ''; } } else if (global.window.mm_config.EnableOpenServer === 'true' || UserStore.getNoAccounts()) { // If this is the first account then let them create an account anyway. // The server will verify it's the first account before allowing creation. // Of if the server is open then we don't care. openServer = true; loading = false; } else { loading = false; this.setState({ noOpenServerError: true, serverError: , loading: false }); } this.setState({ data, hash, usedBefore, email, teamDisplayName, teamName, teamId, openServer, inviteId, loading }); } handleLdapSignup(method, loginId, password, token) { Client.loginByLdap(loginId, password, token, () => { const redirect = Utils.getUrlParameter('redirect'); if (redirect) { browserHistory.push(decodeURIComponent(redirect)); } else { GlobalActions.emitInitialLoad( () => { browserHistory.push('/select_team'); } ); } }, (err) => { this.setState({serverError: err.message}); } ); } handleSubmit(e) { e.preventDefault(); const providedEmail = ReactDOM.findDOMNode(this.refs.email).value.trim(); if (!providedEmail) { this.setState({ nameError: '', emailError: (), passwordError: '', serverError: '' }); return; } if (!Utils.isEmail(providedEmail)) { this.setState({ nameError: '', emailError: (), passwordError: '', serverError: '' }); return; } const providedUsername = ReactDOM.findDOMNode(this.refs.name).value.trim().toLowerCase(); if (!providedUsername) { this.setState({ nameError: (), emailError: '', passwordError: '', serverError: '' }); return; } const usernameError = Utils.isValidUsername(providedUsername); if (usernameError === 'Cannot use a reserved word as a username.') { this.setState({ nameError: (), emailError: '', passwordError: '', serverError: '' }); return; } else if (usernameError) { this.setState({ nameError: ( ), emailError: '', passwordError: '', serverError: '' }); return; } const providedPassword = ReactDOM.findDOMNode(this.refs.password).value.trim(); if (!providedPassword || providedPassword.length < Constants.MIN_PASSWORD_LENGTH) { this.setState({ nameError: '', emailError: '', passwordError: ( ), serverError: '' }); return; } this.setState({ nameError: '', emailError: '', passwordError: '', serverError: '' }); const user = { email: providedEmail, username: providedUsername, password: providedPassword, allow_marketing: true }; Client.createUserWithInvite(user, this.state.data, this.state.hash, this.state.inviteId, () => { Client.track('signup', 'signup_user_02_complete'); Client.login( user.email, null, user.password, '', () => { UserStore.setLastEmail(user.email); if (this.state.hash > 0) { BrowserStore.setGlobalItem(this.state.hash, JSON.stringify({usedBefore: true})); } GlobalActions.emitInitialLoad( () => { browserHistory.push('/select_team'); } ); }, (err) => { if (err.id === 'api.user.login.not_verified.app_error') { browserHistory.push('/should_verify_email?email=' + encodeURIComponent(user.email) + '&teamname=' + encodeURIComponent(this.state.teamName)); } else { this.setState({serverError: err.message}); } } ); }, (err) => { this.setState({serverError: err.message}); } ); } render() { Client.track('signup', 'signup_user_01_welcome'); // If we have been used then just display a message if (this.state.usedBefore) { return (
); } if (this.state.loading) { return (); } // set up error labels var emailError = null; var emailHelpText = ( ); var emailDivStyle = 'form-group'; if (this.state.emailError) { emailError = (); emailHelpText = ''; emailDivStyle += ' has-error'; } var nameError = null; var nameHelpText = ( ); var nameDivStyle = 'form-group'; if (this.state.nameError) { nameError = ; nameHelpText = ''; nameDivStyle += ' has-error'; } var passwordError = null; var passwordDivStyle = 'form-group'; if (this.state.passwordError) { passwordError = ; passwordDivStyle += ' has-error'; } var serverError = null; if (this.state.serverError) { serverError = (
); } // set up the email entry and hide it if an email was provided var yourEmailIs = ''; if (this.state.email) { yourEmailIs = ( ); } var emailContainerStyle = 'margin--extra'; if (this.state.email) { emailContainerStyle = 'hidden'; } var email = (
{emailError} {emailHelpText}
); let signupMessage = []; if (global.window.mm_config.EnableSignUpWithGitLab === 'true') { signupMessage.push( ); } if (global.window.mm_config.EnableSignUpWithGoogle === 'true') { signupMessage.push( ); } let ldapSignup; if (global.window.mm_config.EnableLdap === 'true' && global.window.mm_license.IsLicensed === 'true' && global.window.mm_license.LDAP) { ldapSignup = (
); } let emailSignup; if (global.window.mm_config.EnableSignUpWithEmail === 'true') { emailSignup = (
{email} {yourEmailIs}
{nameError} {nameHelpText}
{passwordError}

); } if (signupMessage.length > 0 && (emailSignup || ldapSignup)) { signupMessage = (
{signupMessage}
); } if (ldapSignup && emailSignup) { ldapSignup = (
{ldapSignup}
); } if (signupMessage.length === 0 && !emailSignup && !ldapSignup) { emailSignup = (
); } let terms = (

); if (this.state.noOpenServerError) { signupMessage = null; ldapSignup = null; emailSignup = null; terms = null; } return (

{global.window.mm_config.SiteName}

{signupMessage} {ldapSignup} {emailSignup} {serverError} {terms}
); } } SignupUserComplete.defaultProps = { }; SignupUserComplete.propTypes = { location: React.PropTypes.object }; export default SignupUserComplete;