You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

165 lines
5.0 KiB

package react.user;
import react.ReactDOM;
import react.ReactComponent;
import react.ReactMacro.jsx;
typedef RegisterBoxState = {firstName:String, lastName:String, email:String, password:String, error:String, phone:String};
typedef RegisterBoxProps = {redirectUrl:String,message:String,phoneRequired:Bool};
/**
* Registration box ( sign up )
* @author fbarbut
*/
class RegisterBox extends react.ReactComponentOfPropsAndState<RegisterBoxProps,RegisterBoxState>
{
public function new(props:RegisterBoxProps)
{
if (props.redirectUrl == null) props.redirectUrl = "/";
super(props);
this.state = {firstName:"",lastName:"",email:"",password:"",error:null,phone:""};
}
override public function render(){
//tips for conditionnal rendering : https://github.com/massiveinteractive/haxe-react#gotchas
var phone = null;
if (props.phoneRequired){
phone = jsx('<div className="form-group">
<label htmlFor="phone" className="col-sm-4 control-label">Téléphone : </label>
<div className="col-sm-8">
<input id="phone" type="text" className="form-control" name="phone" value="${state.phone}" onChange={onChange} />
</div>
</div>');
}
return jsx('
<div>
<$Error error="${state.error}" />
<$Message message="${props.message}" />
<form action="" method="post" className="form-horizontal">
<div className="form-group">
<label htmlFor="firstName" className="col-sm-4 control-label">Prénom : </label>
<div className="col-sm-8">
<input id="firstName" type="text" name="firstName" value="${state.firstName}" className="form-control" onChange={onChange}/>
</div>
</div>
<div className="form-group">
<label htmlFor="lastName" className="col-sm-4 control-label">Nom : </label>
<div className="col-sm-8">
<input id="lastName" type="text" name="lastName" value="${state.lastName}" className="form-control" onChange={onChange}/>
</div>
</div>
<div className="form-group">
<label htmlFor="email" className="col-sm-4 control-label">Email : </label>
<div className="col-sm-8">
<input id="email" type="text" className="form-control" name="email" value="${state.email}" onChange={onChange} />
</div>
</div>
${phone}
<div className="form-group">
<label htmlFor="password" className="col-sm-4 control-label">Mot de passe : </label>
<div className="col-sm-8">
<input id="password" type="password" name="password" value="${state.password}" className="form-control" onChange={onChange}/>
</div>
</div>
<p className="text-center">
<a onClick={submit} className="btn btn-primary btn-lg" ><span className="glyphicon glyphicon-chevron-right"></span> Inscription</a>
</p>
</form>
<hr/>
<p className="text-center">
<b>Déjà inscrit ? </b>
<a onClick={loginBox} className="btn btn-default"><span className="glyphicon glyphicon-user"></span> Connectez-vous ici</a>
</p>
</div>
');
}
/**
* @doc https://facebook.github.io/react/docs/forms.html
*/
function onChange(e:js.html.Event){
e.preventDefault();
var name :String = untyped e.target.name;
var value :String = untyped e.target.value;
//trace('onChange : $name = $value');
Reflect.setField(state, name, value);
this.setState(this.state);
}
/**
* displays a login box
*/
public function loginBox(){
var body = js.Browser.document.querySelector('#myModal .modal-body');
ReactDOM.unmountComponentAtNode( body );
js.Browser.document.querySelector("#myModal .modal-title").innerHTML = "Connexion";
ReactDOM.render(jsx('<$LoginBox redirectUrl="${props.redirectUrl}" />'), body );
}
public function submit(e:js.html.Event ){
if (state.email == ""){
setError("Veuillez saisir votre email");
return;
}
if (state.password == ""){
setError("Veuillez saisir un mot de passe");
return;
}
if (state.firstName == ""){
setError("Veuillez saisir votre prénom");
return;
}
if (state.lastName == ""){
setError("Veuillez saisir votre nom de famille");
return;
}
if (state.phone == "" && props.phoneRequired){
setError("Veuillez saisir votre numéro de téléphone");
return;
}
//lock button
var el : js.html.Element = cast e.target;
el.classList.add("disabled");
var req = new haxe.Http("/api/user/register");
req.addParameter("firstName", state.firstName);
req.addParameter("lastName", state.lastName);
req.addParameter("email", state.email);
req.addParameter("password", state.password);
req.addParameter("redirecturl", props.redirectUrl);
if(props.phoneRequired) req.addParameter("phone", state.phone);
req.onData = req.onError = function(d){
var d = req.responseData;
el.classList.remove("disabled");
var d = haxe.Json.parse(d);
if (Reflect.hasField(d, "error")) setError(d.error.message);
if (Reflect.hasField(d, "success")) js.Browser.window.location.href = props.redirectUrl;
}
req.request(true);
}
function setError(err:String){
this.setState(cast {error:err});
}
}