Advertisement
Guest User

Untitled

a guest
Mar 13th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.84 KB | None | 0 0
  1. var React = require('react');
  2. var Input = require('./Input');
  3. var $ = require('zepto-browserify').$;
  4. var validator = require('validator');
  5. var cx = require('classnames');
  6.  
  7. require('../../../../scss/components/core/signup_form/SignUpForm.scss');
  8.  
  9.  
  10. var SimpleRegisterForm = React.createClass({
  11.  
  12. getDefaultProps: function(){
  13. return({
  14. setActualForm: false,
  15. oBackgroundColor: "#fff",
  16. detailedRegisterForm: false,
  17. hiddenFooter: false,
  18. })
  19. },
  20. getInitialState: function() {
  21.  
  22. return {
  23. emailPristiness: true,
  24. passwordPristiness: true,
  25. usernamePristiness: true,
  26.  
  27. emailDirtiness: false,
  28. passwordDirtiness: false,
  29. usernameDirtiness: false,
  30.  
  31. emailValidState: false,
  32. passwordValidState: false,
  33. usernameValidState: false,
  34.  
  35. emailLastErrorMessage: "",
  36. passwordLastErrorMessage: "",
  37. usernameLastErrorMessage: "",
  38.  
  39. uniqueEmailStatus: false,
  40. uniqueUsernameStatus: false,
  41. errorUsername: '',
  42. forbiddenWords: ["password", "user", "username"],
  43. loaderVisibility: false,
  44. isRegisteringUser: false,
  45. };
  46. },
  47. register: function(event){
  48. let self = this;
  49. event.preventDefault();
  50.  
  51. this.setState({
  52. emailPristiness: false,
  53. passwordPristiness: false,
  54. usernamePristiness: false,
  55. emailDirtiness: true,
  56. passwordDirtiness: true,
  57. usernameDirtiness: true,
  58. }, this.triggerValidations);
  59.  
  60. if( self.state.emailValidState && self.state.passwordValidState && self.state.usernameValidState){
  61. mixpanel.track("registerWithEmail");
  62. self.setState({ isRegisteringUser: true });
  63. $(".FooterRegisterForm__loader").show();
  64. $.post( forms.register,
  65. { email: self.refs.email.value,
  66. username: self.refs.username.value,
  67. password: self.refs.password.value
  68. }, function(response){
  69. location.href = response;
  70. }
  71. );
  72. return false;
  73. }
  74.  
  75. // Disables the button to prevent forced registration
  76. $(".FooterRegisterForm__loader").hide();
  77. self.setState({ isRegisteringUser: false });
  78.  
  79. },
  80. triggerValidations: function(){
  81. this.validateUsername();
  82. this.validateEmail();
  83. this.validatePassword();
  84. },
  85. validateUsername: function(){
  86. const USERNAME_PATTERN = /^[a-zA-Z0-9_-]{6,30}$/;
  87. const NO_SPACES_PATTERN = /^\S+$/;
  88. let username = this.refs.username.value;
  89.  
  90. //It will change pristiness to FALSE later based on Dirtiness status. DO NOT DELETE
  91. if(!this.state.usernameDirtiness){
  92. this.setState({ usernameDirtiness: true });
  93. }
  94.  
  95. if(!this.state.usernamePristiness && this.state.usernameDirtiness){
  96. //Starts the validation
  97. if(username.length===0){
  98. this.setState({ usernameValidState: false, usernameLastErrorMessage: "El campo usuario es obligatorio"});
  99. }else if(username.length<6){
  100. this.setState({ usernameValidState: false, usernameLastErrorMessage: "El usuario debe tener mínimo 6 caracteres"});
  101. }else if(username.length>30){
  102. this.setState({ usernameValidState: false, usernameLastErrorMessage: "El usuario debe tener máximo 30 caracteres"});
  103. }else if( !validator.matches(username, USERNAME_PATTERN) ){
  104. this.setState({ usernameValidState: false });
  105. if( !validator.matches(username, NO_SPACES_PATTERN) ){
  106. this.setState({usernameLastErrorMessage: "El nombre de usuario no puede contener espacios"});
  107. }else{
  108. this.setState({usernameLastErrorMessage: "El nombre de usuario no puede tener caracteres especiales como @, #, ¨¨"});
  109. }
  110. }
  111. else{
  112. this.setState({ usernameValidState: true });
  113. this.checkUsernameAvailabilityService(username);
  114. }
  115. }
  116. },
  117. validatePassword: function(){
  118. const PASSWORD_PATTERN = /^(?=.*[a-zA-Z0-9]).{6,50}$/;
  119. let password = this.refs.password.value;
  120.  
  121. //It will change pristiness to FALSE later based on Dirtiness status. DO NOT DELETE
  122. if(!this.state.passwordDirtiness){
  123. this.setState({ passwordDirtiness: true });
  124. }
  125.  
  126. if(!this.state.pristinePasswordStatus && this.state.passwordDirtiness){
  127. //Starts the validation
  128. if(password.length===0){
  129. this.setState({ passwordValidState: false, passwordLastErrorMessage: "El campo contraseña es obligatorio"});
  130. }else if( password.length<6){
  131. this.setState({ passwordValidState: false, passwordLastErrorMessage: "La contraseña debe tener minimo 6 caracteres"});
  132. }else if( password.length>50){
  133. this.setState({ passwordValidState: false, passwordLastErrorMessage: "La contraseña debe tener maximo 50 caracteres"});
  134. }else if( !validator.matches(password, PASSWORD_PATTERN) ){
  135. this.setState({ passwordValidState: false, passwordLastErrorMessage: "La contraseña no puede contener espacios en blanco"});
  136. }else{
  137. this.setState({ passwordValidState: true});
  138. }
  139.  
  140. }/*else{
  141. return true;
  142. }*/
  143. },
  144. validateEmail: function(){
  145. const EMAIL_PATTERN = /^([a-zA-Z0-9_\.-]+)@([\da-zA-Z\.-]+)\.([a-zA-Z\.]{2,6})$/;
  146. let email = this.refs.email.value;
  147.  
  148. //It will change pristiness to FALSE later based on Dirtiness status. DO NOT DELETE
  149. if(!this.state.emailDirtiness){
  150. this.setState({ emailDirtiness: true });
  151. }
  152.  
  153. if(!this.state.emailPristiness && this.state.emailDirtiness){
  154. //Starts the validation
  155. if( email.length === 0 ){
  156. this.setState({ emailValidState: false, emailLastErrorMessage: "El campo correo electrónico es obligatorio"});
  157. }else if( !validator.matches(email, EMAIL_PATTERN) ){
  158. this.setState({ emailValidState: false, emailLastErrorMessage: "Ingrese un correo electrónico válido"});
  159. }
  160. else{
  161. this.setState({ emailValidState: true });
  162. this.checkEmailAvailabilityService(email);
  163. }
  164. }
  165. },
  166. checkEmailAvailabilityService: function(email){
  167. var self = this;
  168. $.post('/validate-username-email/', { email: email, username: "" }, function(response){
  169. if(response.email.status){
  170. self.setState({ emailValidState: false, emailLastErrorMessage: "Ya existe un usuario con este correo electrónico"});
  171. }
  172. }, "json");
  173. },
  174. checkUsernameAvailabilityService: function(username){
  175. var self = this;
  176. $.post('/validate-username-email/', { username: username, email: "" }, function(response){
  177. if(response.username.status){
  178. self.setState({ usernameValidState: false, usernameLastErrorMessage: "Nombre de usuario no disponible"});
  179. }
  180. }, "json");
  181. },
  182. csrfValidation: function(){
  183. if(next){
  184. return(
  185. <input type="hidden" value={ next } name="next" />
  186. )
  187. }else{
  188. return(
  189. <input type="hidden" value={courses_app} name="next" />
  190. )
  191. }
  192. },
  193. clearEmail: function () {
  194. this.setState({
  195. emailValidState: true,
  196. emailPristiness: true
  197. });
  198. },
  199. clearPassword: function () {
  200. this.setState({
  201. passwordValidState: true,
  202. passwordPristiness: true
  203. });
  204. },
  205. clearUsername: function () {
  206. this.setState({
  207. usernameValidState: true,
  208. usernamePristiness: true
  209. });
  210. },
  211. validateDuplicateEmail: function(){
  212. var self= this;
  213. if(this.refs.email.isValid()){
  214. $.post('/validate-username-email/', { email: self.refs.email.getValue(), username: self.refs.username.getValue() }, function(response){
  215. response = JSON.parse(response);
  216. if(response.email.status == true){
  217. self.refs.email.setBackendError(false, response.email.message);
  218. self.setState({uniqueEmailStatus: false})
  219. return false;
  220. }else{
  221. self.refs.email.setValid();
  222. self.setState({uniqueEmailStatus: true})
  223. return true;
  224. }
  225. });
  226. }
  227. },
  228. validateDuplicateUsername: function(){
  229. var self= this;
  230. if(this.refs.username.isValid()){
  231. $.post('/validate-username-email/', { email: self.refs.email.getValue(), username: self.refs.username.getValue() }, function(response){
  232. response = JSON.parse(response);
  233. if(response.username.status == true){
  234. self.refs.username.setBackendError(false, response.username.message);
  235. self.setState({uniqueUsernameStatus: false});
  236. return false;
  237. }else{
  238. self.refs.username.setValid();
  239. self.setState({uniqueUsernameStatus: true});
  240. return true;
  241. }
  242. });
  243. }
  244. },
  245. _openLogin: function(event){
  246. event.preventDefault();
  247. if(this.props.setActualForm){
  248. this.props.setActualForm(2);
  249. }else{
  250. location.href = "/entrar";
  251. }
  252. },
  253. handlePasswordBlur: function(){
  254. if(this.state.passwordPristiness && this.state.passwordDirtiness){
  255. this.setState({ passwordPristiness: !this.state.passwordDirtiness }, this.validatePassword);
  256. }
  257. },
  258. handleEmailBlur: function(){
  259. if(this.state.emailPristiness && this.state.emailDirtiness){
  260. this.setState({ emailPristiness: !this.state.emailDirtiness }, this.validateEmail);
  261. }
  262. },
  263. handleUsernameBlur: function(){
  264. if(this.state.usernamePristiness && this.state.usernameDirtiness){
  265. this.setState({ usernamePristiness: !this.state.usernameDirtiness }, this.validateUsername);
  266. }
  267. },
  268. _showRegisterForm: function(){
  269. $('.registerForm').show();
  270. $('.registerWithEmailLabel').hide();
  271. $('.buttons-container').css("margin-top", "0");
  272. mixpanel.track("showRegisterForm");
  273. },
  274. _trackRegisterWithFacebook: function(){
  275. mixpanel.track("registerWithFacebook");
  276. },
  277. componentDidMount: function(){
  278. if(this.props.detailedRegisterForm){
  279. this._showRegisterForm();
  280. }
  281. },
  282. render: function() {
  283. var email_container = cx(
  284. 'input-container'
  285. ,{'invalid' : !this.state.emailValidState && !this.state.emailPristiness}
  286. ,{'valid' : this.state.emailValidState && !this.state.emailPristiness}
  287. );
  288. var password_container = cx(
  289. 'input-container'
  290. ,{'invalid' : !this.state.passwordValidState && !this.state.passwordPristiness}
  291. ,{'valid' : this.state.passwordValidState && !this.state.passwordPristiness}
  292. );
  293. var username_container = cx(
  294. 'input-container'
  295. ,{'invalid' : !this.state.usernameValidState && !this.state.usernamePristiness}
  296. ,{'valid' : this.state.usernameValidState && !this.state.usernamePristiness}
  297. );
  298. let registerFormFooter = cx(
  299. 'registerFormFooter'
  300. ,{'isInvisible': this.props.hiddenFooter}
  301. )
  302.  
  303. let FooterRegisterForm__registerButton = cx('FooterRegisterForm__registerButton', { 'isSendingForm' : this.state.isRegisteringUser })
  304.  
  305. return (
  306. <section id="register-form">
  307. <div className="signup-content">
  308. <form id="registerForm">
  309. <div className="registerForm">
  310. <div className="validation-inputs">
  311. <div className={email_container} >
  312. <input ref="email" type="email" onBlur={this.handleEmailBlur} onChange={this.validateEmail} placeholder="Correo Electrónico" onFocus={this.clearEmail} />
  313. <div className="error_message_container">
  314. <p className="error_message"><img src="/static/img/footer/error-icon.png" alt="icono error" className="errorExclamationImage" />{this.state.emailLastErrorMessage}</p>
  315. </div>
  316. </div>
  317. <div className={password_container} >
  318. <input ref="password" type="password" onBlur={this.handlePasswordBlur} onChange={this.validatePassword} placeholder="Contraseña" onFocus={this.clearPassword} />
  319. <div className="error_message_container">
  320. <p className="error_message"><img src="/static/img/footer/error-icon.png" alt="icono error" className="errorExclamationImage" />{this.state.passwordLastErrorMessage}</p>
  321. </div>
  322. </div>
  323. <div className={username_container} >
  324. <input ref="username" type="text" onBlur={this.handleUsernameBlur} onChange={this.validateUsername} placeholder="Nombre de usuario" onFocus={this.clearUsername} />
  325. <div className="error_message_container">
  326. <p className="error_message"><img src="/static/img/footer/error-icon.png" alt="icono error" className="errorExclamationImage" />{this.state.usernameLastErrorMessage}</p>
  327. </div>
  328. </div>
  329. </div>
  330. <p className="FooterRegisterForm__terms">
  331. Al registrarte, estás aceptando nuestros a <a href="#"className="FooterRegisterForm__termsLink">Términos y Condiciones</a>
  332. </p>
  333. <div className="FooterRegisterForm__registerButtonContainer" onClick={this.register}>
  334. <button className={FooterRegisterForm__registerButton} >
  335. Comienza un curso gratis
  336. </button>
  337. <img className="FooterRegisterForm__loader" src="/static/img/icon-loading.gif" alt="imagen cargando" />
  338. </div>
  339. </div>
  340. </form>
  341. </div>
  342. </section>
  343. );
  344. }
  345.  
  346. });
  347.  
  348. export default SimpleRegisterForm;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement