2016-07-07 23:23:18 +02:00
import React , { Component , PropTypes } from "react" ;
2016-07-28 01:22:48 +02:00
import { FormattedMessage } from "react-intl" ;
2016-07-07 23:23:18 +02:00
export class LoginForm extends Component {
constructor ( props ) {
2016-07-25 23:22:44 +02:00
super ( props ) ;
2016-07-07 23:23:18 +02:00
2016-07-25 23:22:44 +02:00
this . handleSubmit = this . handleSubmit . bind ( this ) ;
2016-07-07 23:23:18 +02:00
}
setError ( formGroup , error ) {
if ( error ) {
formGroup . classList . add ( "has-error" ) ;
formGroup . classList . remove ( "has-success" ) ;
return true ;
}
formGroup . classList . remove ( "has-error" ) ;
formGroup . classList . add ( "has-success" ) ;
return false ;
}
handleSubmit ( e ) {
e . preventDefault ( ) ;
const username = this . refs . username . value . trim ( ) ;
const password = this . refs . password . value . trim ( ) ;
const endpoint = this . refs . endpoint . value . trim ( ) ;
const rememberMe = this . refs . rememberMe . checked ;
var hasError = this . setError ( this . refs . usernameFormGroup , ! username ) ;
hasError |= this . setError ( this . refs . passwordFormGroup , ! password ) ;
hasError |= this . setError ( this . refs . endpointFormGroup , ! endpoint ) ;
if ( ! hasError ) {
2016-07-25 23:22:44 +02:00
this . props . onSubmit ( username , password , endpoint , rememberMe ) ;
2016-07-07 23:23:18 +02:00
}
}
2016-07-25 23:22:44 +02:00
componentDidUpdate ( ) {
2016-07-07 23:23:18 +02:00
if ( this . props . error ) {
$ ( this . refs . loginForm ) . shake ( 3 , 10 , 300 ) ;
this . setError ( this . refs . usernameFormGroup , this . props . error ) ;
this . setError ( this . refs . passwordFormGroup , this . props . error ) ;
this . setError ( this . refs . endpointFormGroup , this . props . error ) ;
}
}
render ( ) {
return (
< div >
{
this . props . error ?
< div className = "row" >
< div className = "alert alert-danger" >
2016-07-26 13:21:37 +02:00
< p id = "loginFormError" >
< span className = "glyphicon glyphicon-exclamation-sign" aria - hidden = "true" > < / span > { this . props . error }
< / p >
2016-07-07 23:23:18 +02:00
< / div >
< / div >
: null
}
{
this . props . info ?
< div className = "row" >
2016-07-26 13:21:37 +02:00
< div className = "alert alert-info" id = "loginFormInfo" >
< p > { this . props . info } < / p >
2016-07-07 23:23:18 +02:00
< / div >
< / div >
: null
}
< div className = "row" >
2016-07-26 13:21:37 +02:00
< form className = "col-sm-9 col-sm-offset-1 col-md-6 col-md-offset-3 text-left form-horizontal login" onSubmit = { this . handleSubmit } ref = "loginForm" aria - describedby = "loginFormInfo loginFormError" >
2016-07-07 23:23:18 +02:00
< div className = "row" >
< div className = "form-group" ref = "usernameFormGroup" >
< div className = "col-xs-12" >
2016-07-26 13:21:37 +02:00
< input type = "text" className = "form-control" ref = "username" aria - label = "Username" placeholder = "Username" autoFocus defaultValue = { this . props . username } / >
2016-07-07 23:23:18 +02:00
< / div >
< / div >
< div className = "form-group" ref = "passwordFormGroup" >
< div className = "col-xs-12" >
2016-07-26 13:21:37 +02:00
< input type = "password" className = "form-control" ref = "password" aria - label = "Password" placeholder = "Password" / >
2016-07-07 23:23:18 +02:00
< / div >
< / div >
< div className = "form-group" ref = "endpointFormGroup" >
< div className = "col-xs-12" >
2016-07-26 13:21:37 +02:00
< input type = "text" className = "form-control" ref = "endpoint" aria - label = "URL of your Ampache instance (e.g. http://ampache.example.com)" placeholder = "http://ampache.example.com" defaultValue = { this . props . endpoint } / >
2016-07-07 23:23:18 +02:00
< / div >
< / div >
< div className = "form-group" >
< div className = "col-xs-12" >
< div className = "row" >
< div className = "col-sm-6 col-xs-12 checkbox" >
2016-07-26 13:21:37 +02:00
< label id = "rememberMeLabel" >
2016-07-28 01:22:48 +02:00
< input type = "checkbox" ref = "rememberMe" defaultChecked = { this . props . rememberMe } aria - labelledby = "rememberMeLabel" / > < FormattedMessage id = "app.login.rememberMe" description = "Remember me checkbox label" defaultMessage = "Remember me" / >
2016-07-07 23:23:18 +02:00
< / label >
< / div >
< div className = "col-sm-6 col-sm-12 submit text-right" >
2016-07-26 13:21:37 +02:00
< input type = "submit" className = "btn btn-default" aria - label = "Sign in" defaultValue = "Sign in" disabled = { this . props . isAuthenticating } / >
2016-07-07 23:23:18 +02:00
< / div >
< / div >
< / div >
< / div >
< / div >
< / form >
< / div >
< / div >
) ;
}
}
LoginForm . propTypes = {
username : PropTypes . string ,
endpoint : PropTypes . string ,
rememberMe : PropTypes . bool ,
onSubmit : PropTypes . func . isRequired ,
isAuthenticating : PropTypes . bool ,
error : PropTypes . string ,
info : PropTypes . string
} ;
export default class Login extends Component {
render ( ) {
return (
2016-07-27 14:10:01 +02:00
< div className = "login text-center container-fluid" >
2016-07-07 23:23:18 +02:00
< h1 > < img src = "./app/assets/img/ampache-blue.png" alt = "A" / > mpache < / h1 >
< hr / >
2016-07-28 01:22:48 +02:00
< p > < FormattedMessage id = "app.login.greeting" description = "Greeting to welcome the user to the app" defaultMessage = "Welcome back on Ampache, let's go!" / > < / p >
2016-07-07 23:23:18 +02:00
< div className = "col-sm-9 col-sm-offset-2 col-md-6 col-md-offset-3" >
< LoginForm onSubmit = { this . props . onSubmit } username = { this . props . username } endpoint = { this . props . endpoint } rememberMe = { this . props . rememberMe } isAuthenticating = { this . props . isAuthenticating } error = { this . props . error } info = { this . props . info } / >
< / div >
< / div >
) ;
}
}
Login . propTypes = {
username : PropTypes . string ,
endpoint : PropTypes . string ,
rememberMe : PropTypes . bool ,
onSubmit : PropTypes . func . isRequired ,
isAuthenticating : PropTypes . bool ,
error : PropTypes . string ,
info : PropTypes . string
} ;