2015-10-08 12:27:09 -04:00
// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved.
2015-06-14 23:53:32 -08:00
// See License.txt for license information.
2015-11-19 21:12:56 -05:00
import * as Utils from '../utils/utils.jsx' ;
import * as client from '../utils/client.jsx' ;
import UserStore from '../stores/user_store.jsx' ;
import BrowserStore from '../stores/browser_store.jsx' ;
2016-01-19 12:39:51 -08:00
import Constants from '../utils/constants.jsx' ;
2015-06-14 23:53:32 -08:00
2016-01-29 00:24:43 -03:00
import { intlShape , injectIntl , defineMessages , FormattedMessage , FormattedHTMLMessage } from 'mm-intl' ;
const holders = defineMessages ( {
required : {
id : 'signup_user_completed.required' ,
defaultMessage : 'This field is required'
} ,
validEmail : {
id : 'signup_user_completed.validEmail' ,
defaultMessage : 'Please enter a valid email address'
} ,
reserved : {
id : 'signup_user_completed.reserved' ,
defaultMessage : 'This username is reserved, please choose a new one.'
} ,
usernameLength : {
id : 'signup_user_completed.usernameLength' ,
defaultMessage : 'Username must begin with a letter, and contain between {min} to {max} lowercase characters made up of numbers, letters, and the symbols \'.\', \'-\' and \'_\'.'
} ,
passwordLength : {
id : 'signup_user_completed.passwordLength' ,
defaultMessage : 'Please enter at least {min} characters'
}
} ) ;
class SignupUserComplete extends React . Component {
2015-08-31 09:35:31 -07:00
constructor ( props ) {
super ( props ) ;
this . handleSubmit = this . handleSubmit . bind ( this ) ;
var initialState = BrowserStore . getGlobalItem ( this . props . hash ) ;
if ( ! initialState ) {
initialState = { } ;
initialState . wizard = 'welcome' ;
initialState . user = { } ;
initialState . user . team _id = this . props . teamId ;
initialState . user . email = this . props . email ;
initialState . original _email = this . props . email ;
}
this . state = initialState ;
}
handleSubmit ( e ) {
2015-08-05 15:41:12 -04:00
e . preventDefault ( ) ;
2015-06-14 23:53:32 -08:00
2016-01-29 00:24:43 -03:00
const { formatMessage } = this . props . intl ;
2015-10-15 12:07:06 -04:00
const providedEmail = ReactDOM . findDOMNode ( this . refs . email ) . value . trim ( ) ;
2015-09-22 16:38:46 -07:00
if ( ! providedEmail ) {
2016-01-29 00:24:43 -03:00
this . setState ( { nameError : '' , emailError : formatMessage ( holders . required ) , passwordError : '' } ) ;
2015-09-22 16:38:46 -07:00
return ;
}
if ( ! Utils . isEmail ( providedEmail ) ) {
2016-01-29 00:24:43 -03:00
this . setState ( { nameError : '' , emailError : formatMessage ( holders . validEmail ) , passwordError : '' } ) ;
2015-09-22 16:38:46 -07:00
return ;
}
2015-10-15 12:07:06 -04:00
const providedUsername = ReactDOM . findDOMNode ( this . refs . name ) . value . trim ( ) . toLowerCase ( ) ;
2015-10-05 09:58:42 -04:00
if ( ! providedUsername ) {
2016-01-29 00:24:43 -03:00
this . setState ( { nameError : formatMessage ( holders . required ) , emailError : '' , passwordError : '' , serverError : '' } ) ;
2015-06-14 23:53:32 -08:00
return ;
}
2015-10-06 08:41:49 -04:00
const usernameError = Utils . isValidUsername ( providedUsername ) ;
2015-08-05 15:41:12 -04:00
if ( usernameError === 'Cannot use a reserved word as a username.' ) {
2016-01-29 00:24:43 -03:00
this . setState ( { nameError : formatMessage ( holders . reserved ) , emailError : '' , passwordError : '' , serverError : '' } ) ;
2015-06-14 23:53:32 -08:00
return ;
2015-08-05 15:41:12 -04:00
} else if ( usernameError ) {
this . setState ( {
2016-01-29 00:24:43 -03:00
nameError : formatMessage ( holders . usernameLength , { min : Constants . MIN _USERNAME _LENGTH , max : Constants . MAX _USERNAME _LENGTH } ) ,
2015-08-05 15:41:12 -04:00
emailError : '' ,
passwordError : '' ,
serverError : ''
} ) ;
2015-06-14 23:53:32 -08:00
return ;
}
2015-10-15 12:07:06 -04:00
const providedPassword = ReactDOM . findDOMNode ( this . refs . password ) . value . trim ( ) ;
2016-01-19 12:39:51 -08:00
if ( ! providedPassword || providedPassword . length < Constants . MIN _PASSWORD _LENGTH ) {
2016-01-29 00:24:43 -03:00
this . setState ( { nameError : '' , emailError : '' , passwordError : formatMessage ( holders . passwordLength , { min : Constants . MIN _PASSWORD _LENGTH } ) , serverError : '' } ) ;
2015-06-14 23:53:32 -08:00
return ;
}
2015-10-06 08:41:49 -04:00
const user = {
team _id : this . props . teamId ,
email : providedEmail ,
username : providedUsername ,
password : providedPassword ,
allow _marketing : true
} ;
2015-10-05 09:58:42 -04:00
this . setState ( {
2015-10-06 08:41:49 -04:00
user ,
2015-10-05 09:58:42 -04:00
nameError : '' ,
emailError : '' ,
passwordError : '' ,
serverError : ''
} ) ;
2015-06-14 23:53:32 -08:00
2015-10-06 08:41:49 -04:00
client . createUser ( user , this . props . data , this . props . hash ,
2015-10-16 09:10:54 -07:00
( ) => {
2015-06-14 23:53:32 -08:00
client . track ( 'signup' , 'signup_user_02_complete' ) ;
2015-10-06 08:41:49 -04:00
client . loginByEmail ( this . props . teamName , user . email , user . password ,
2015-10-16 09:10:54 -07:00
( ) => {
2015-10-06 08:41:49 -04:00
UserStore . setLastEmail ( user . email ) ;
2015-08-05 15:41:12 -04:00
if ( this . props . hash > 0 ) {
BrowserStore . setGlobalItem ( this . props . hash , JSON . stringify ( { wizard : 'finished' } ) ) ;
2015-07-08 11:50:10 -04:00
}
2015-09-25 08:36:02 -07:00
window . location . href = '/' + this . props . teamName + '/channels/town-square' ;
2015-10-16 09:10:54 -07:00
} ,
( err ) => {
2016-01-29 00:24:43 -03:00
if ( err . id === 'api.user.login.not_verified.app_error' ) {
2015-10-06 08:41:49 -04:00
window . location . href = '/verify_email?email=' + encodeURIComponent ( user . email ) + '&teamname=' + encodeURIComponent ( this . props . teamName ) ;
2015-07-12 23:36:52 -08:00
} else {
2015-08-05 15:41:12 -04:00
this . setState ( { serverError : err . message } ) ;
2015-07-12 23:36:52 -08:00
}
2015-10-16 09:10:54 -07:00
}
2015-07-12 23:36:52 -08:00
) ;
2015-10-16 09:10:54 -07:00
} ,
( err ) => {
2015-08-05 15:41:12 -04:00
this . setState ( { serverError : err . message } ) ;
2015-10-16 09:10:54 -07:00
}
2015-06-14 23:53:32 -08:00
) ;
2015-08-31 09:35:31 -07:00
}
render ( ) {
2015-06-14 23:53:32 -08:00
client . track ( 'signup' , 'signup_user_01_welcome' ) ;
2015-08-05 15:41:12 -04:00
if ( this . state . wizard === 'finished' ) {
2016-01-29 00:24:43 -03:00
return (
< div >
< FormattedMessage
id = 'signup_user_completed.expired'
defaultMessage = "You've already completed the signup process for this invitation or this invitation has expired."
/ >
< / div >
) ;
2015-08-05 15:41:12 -04:00
}
// set up error labels
var emailError = null ;
2016-02-02 16:04:25 +07:00
var emailHelpText = (
< span className = 'help-block' >
< FormattedMessage
id = 'signup_user_completed.emailHelp'
2016-02-02 16:29:14 +07:00
defaultMessage = 'Valid email required for sign-up'
/ >
2016-02-02 16:04:25 +07:00
< / span >
) ;
2015-08-05 15:41:12 -04:00
var emailDivStyle = 'form-group' ;
if ( this . state . emailError ) {
emailError = < label className = 'control-label' > { this . state . emailError } < / label > ;
2016-02-02 16:04:25 +07:00
emailHelpText = '' ;
2015-08-05 15:41:12 -04:00
emailDivStyle += ' has-error' ;
}
var nameError = null ;
2016-01-29 00:24:43 -03:00
var nameHelpText = (
< span className = 'help-block' >
< FormattedMessage
id = 'signup_user_completed.userHelp'
defaultMessage = "Username must begin with a letter, and contain between {min} to {max} lowercase characters made up of numbers, letters, and the symbols '.', '-' and '_'"
values = { {
min : Constants . MIN _USERNAME _LENGTH ,
max : Constants . MAX _USERNAME _LENGTH
} }
/ >
< / span >
) ;
2015-08-05 15:41:12 -04:00
var nameDivStyle = 'form-group' ;
if ( this . state . nameError ) {
nameError = < label className = 'control-label' > { this . state . nameError } < / label > ;
2016-01-19 12:39:51 -08:00
nameHelpText = '' ;
2015-08-05 15:41:12 -04:00
nameDivStyle += ' has-error' ;
}
var passwordError = null ;
var passwordDivStyle = 'form-group' ;
if ( this . state . passwordError ) {
passwordError = < label className = 'control-label' > { this . state . passwordError } < / label > ;
passwordDivStyle += ' has-error' ;
}
var serverError = null ;
if ( this . state . serverError ) {
serverError = (
< div className = { 'form-group has-error' } >
< label className = 'control-label' > { this . state . serverError } < / label >
< / div >
) ;
2015-06-14 23:53:32 -08:00
}
2015-08-05 15:41:12 -04:00
// set up the email entry and hide it if an email was provided
var yourEmailIs = '' ;
if ( this . state . user . email ) {
2016-01-29 00:24:43 -03:00
yourEmailIs = (
< FormattedHTMLMessage
id = 'signup_user_completed.emailIs'
defaultMessage = "Your email address is <strong>{email}</strong>. You'll use this address to sign in to {siteName}."
values = { {
email : this . state . user . email ,
siteName : global . window . mm _config . SiteName
} }
/ >
) ;
2015-08-05 15:41:12 -04:00
}
2015-06-14 23:53:32 -08:00
2015-08-31 09:35:31 -07:00
var emailContainerStyle = 'margin--extra' ;
2015-08-05 15:41:12 -04:00
if ( this . state . original _email ) {
2015-08-31 09:35:31 -07:00
emailContainerStyle = 'hidden' ;
2015-08-05 15:41:12 -04:00
}
2015-06-14 23:53:32 -08:00
2015-07-22 15:32:39 -04:00
var email = (
2015-08-05 15:41:12 -04:00
< div className = { emailContainerStyle } >
2016-01-29 00:24:43 -03:00
< h5 > < strong >
< FormattedMessage
id = 'signup_user_completed.whatis'
defaultMessage = "What's your email address?"
/ >
< / strong > < / h5 >
2015-08-05 15:41:12 -04:00
< div className = { emailDivStyle } >
2015-08-31 09:35:31 -07:00
< input
type = 'email'
ref = 'email'
className = 'form-control'
defaultValue = { this . state . user . email }
placeholder = ''
maxLength = '128'
autoFocus = { true }
2015-10-11 22:28:45 +02:00
spellCheck = 'false'
2015-08-31 09:35:31 -07:00
/ >
2015-08-05 15:41:12 -04:00
{ emailError }
2016-02-02 16:04:25 +07:00
{ emailHelpText }
2015-06-14 23:53:32 -08:00
< / div >
2015-08-05 15:41:12 -04:00
< / div >
2015-07-22 15:32:39 -04:00
) ;
2015-08-14 08:43:49 -04:00
var signupMessage = [ ] ;
2015-10-16 09:10:54 -07:00
if ( global . window . mm _config . EnableSignUpWithGitLab === 'true' ) {
2015-08-14 08:43:49 -04:00
signupMessage . push (
2015-08-31 09:35:31 -07:00
< a
className = 'btn btn-custom-login gitlab'
2016-01-29 00:24:43 -03:00
key = 'gitlab'
2015-08-31 09:35:31 -07:00
href = { '/' + this . props . teamName + '/signup/gitlab' + window . location . search }
>
2016-02-22 08:31:10 -05:00
< span className = 'icon' / >
2016-01-29 00:24:43 -03:00
< span >
< FormattedMessage
id = 'signup_user_completed.gitlab'
defaultMessage = 'with GitLab'
/ >
< / span >
2015-08-05 15:41:12 -04:00
< / a >
2015-08-14 08:43:49 -04:00
) ;
}
2015-12-08 13:38:43 -05:00
if ( global . window . mm _config . EnableSignUpWithGoogle === 'true' ) {
signupMessage . push (
< a
className = 'btn btn-custom-login google'
2016-01-29 00:24:43 -03:00
key = 'google'
2015-12-08 13:38:43 -05:00
href = { '/' + this . props . teamName + '/signup/google' + window . location . search }
>
2016-02-22 08:31:10 -05:00
< span className = 'icon' / >
2016-01-29 00:24:43 -03:00
< span >
< FormattedMessage
id = 'signup_user_completed.google'
defaultMessage = 'with Google'
/ >
< / span >
2015-12-08 13:38:43 -05:00
< / a >
) ;
}
2015-08-28 08:37:55 -04:00
var emailSignup ;
2015-10-16 09:10:54 -07:00
if ( global . window . mm _config . EnableSignUpWithEmail === 'true' ) {
2015-08-28 08:37:55 -04:00
emailSignup = (
< div >
< div className = 'inner__content' >
{ email }
{ yourEmailIs }
< div className = 'margin--extra' >
2016-01-29 00:24:43 -03:00
< h5 > < strong >
< FormattedMessage
id = 'signup_user_completed.chooseUser'
defaultMessage = 'Choose your username'
/ >
< / strong > < / h5 >
2015-08-28 08:37:55 -04:00
< div className = { nameDivStyle } >
2015-08-31 09:35:31 -07:00
< input
type = 'text'
ref = 'name'
className = 'form-control'
placeholder = ''
2016-02-05 09:41:23 -08:00
maxLength = { Constants . MAX _USERNAME _LENGTH }
2015-10-11 22:28:45 +02:00
spellCheck = 'false'
2015-08-31 09:35:31 -07:00
/ >
2015-08-28 08:37:55 -04:00
{ nameError }
2016-01-19 12:39:51 -08:00
{ nameHelpText }
2015-08-28 08:37:55 -04:00
< / div >
< / div >
< div className = 'margin--extra' >
2016-01-29 00:24:43 -03:00
< h5 > < strong >
< FormattedMessage
id = 'signup_user_completed.choosePwd'
defaultMessage = 'Choose your password'
/ >
< / strong > < / h5 >
2015-08-28 08:37:55 -04:00
< div className = { passwordDivStyle } >
2015-08-31 09:35:31 -07:00
< input
type = 'password'
ref = 'password'
className = 'form-control'
placeholder = ''
maxLength = '128'
2015-10-11 22:28:45 +02:00
spellCheck = 'false'
2015-08-31 09:35:31 -07:00
/ >
2015-08-28 08:37:55 -04:00
{ passwordError }
< / div >
< / div >
< / div >
2015-08-31 09:35:31 -07:00
< p className = 'margin--extra' >
< button
type = 'submit'
onClick = { this . handleSubmit }
className = 'btn-primary btn'
>
2016-01-29 00:24:43 -03:00
< FormattedMessage
id = 'signup_user_completed.create'
defaultMessage = 'Create Account'
/ >
2015-08-31 09:35:31 -07:00
< / button >
< / p >
2015-08-28 08:37:55 -04:00
< / div >
) ;
}
if ( signupMessage . length > 0 && emailSignup ) {
2015-08-14 08:43:49 -04:00
signupMessage = (
< div >
{ signupMessage }
2015-08-05 15:41:12 -04:00
< div className = 'or__container' >
2016-02-23 22:46:16 +05:00
< FormattedMessage
id = 'signup_user_completed.or'
defaultMessage = 'or'
/ >
2015-08-05 15:41:12 -04:00
< / div >
2015-08-14 08:43:49 -04:00
< / div >
) ;
2015-07-22 15:32:39 -04:00
}
2015-06-14 23:53:32 -08:00
2016-02-08 14:16:04 -08:00
if ( signupMessage . length === 0 && ! emailSignup ) {
emailSignup = (
< div >
< FormattedMessage
id = 'signup_user_completed.none'
defaultMessage = 'No user creation method has been enabled. Please contact an administrator for access.'
/ >
< / div >
) ;
}
2015-06-14 23:53:32 -08:00
return (
< div >
2015-07-29 16:17:20 -04:00
< form >
2015-08-31 09:35:31 -07:00
< img
className = 'signup-team-logo'
src = '/static/images/logo.png'
/ >
2016-01-29 00:24:43 -03:00
< h5 className = 'margin--less' >
< FormattedMessage
id = 'signup_user_completed.welcome'
defaultMessage = 'Welcome to:'
/ >
< / h5 >
2015-08-05 15:41:12 -04:00
< h2 className = 'signup-team__name' > { this . props . teamDisplayName } < / h2 >
2016-01-29 00:24:43 -03:00
< h2 className = 'signup-team__subdomain' >
< FormattedMessage
id = 'signup_user_completed.onSite'
defaultMessage = 'on {siteName}'
values = { {
siteName : global . window . mm _config . SiteName
} }
/ >
< / h2 >
< h4 className = 'color--light' >
< FormattedMessage
id = 'signup_user_completed.lets'
defaultMessage = "Let's create your account"
/ >
< / h4 >
2015-08-05 15:41:12 -04:00
{ signupMessage }
2015-08-28 08:37:55 -04:00
{ emailSignup }
2015-08-05 15:41:12 -04:00
{ serverError }
2015-07-29 16:17:20 -04:00
< / form >
2015-06-14 23:53:32 -08:00
< / div >
) ;
}
2015-08-31 09:35:31 -07:00
}
2015-06-14 23:53:32 -08:00
2015-08-31 09:35:31 -07:00
SignupUserComplete . defaultProps = {
teamName : '' ,
hash : '' ,
teamId : '' ,
email : '' ,
data : null ,
teamDisplayName : ''
} ;
SignupUserComplete . propTypes = {
2016-01-29 00:24:43 -03:00
intl : intlShape . isRequired ,
2015-08-31 09:35:31 -07:00
teamName : React . PropTypes . string ,
hash : React . PropTypes . string ,
teamId : React . PropTypes . string ,
email : React . PropTypes . string ,
data : React . PropTypes . string ,
teamDisplayName : React . PropTypes . string
} ;
2016-01-29 00:24:43 -03:00
export default injectIntl ( SignupUserComplete ) ;