2
0

Register.jsx 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import React, { Component } from "react";
  2. import PropTypes from "prop-types";
  3. import io from "../../io";
  4. import config from "../../../../config/default";
  5. export default class Register extends Component {
  6. static propTypes = {
  7. password: PropTypes.string,
  8. username: PropTypes.string,
  9. email: PropTypes.string,
  10. recaptcha: PropTypes.string,
  11. }
  12. constructor() {
  13. super();
  14. this.state = {
  15. password: "",
  16. username: "",
  17. email: "",
  18. recaptcha: "",
  19. };
  20. this.register = this.register.bind(this);
  21. }
  22. componentDidMount() {
  23. this.state.recaptcha = grecaptcha.render("recaptcha", {
  24. "sitekey": config.recaptcha.key,
  25. });
  26. }
  27. updateField(field, event) {
  28. this.setState({
  29. [field]: event.target.value,
  30. });
  31. }
  32. register() {
  33. io.getSocket(socket => {
  34. // if (!email || !username || !password) return Toast.methods.addToast('Please fill in all fields', 8000);
  35. // if (!validation.isLength(email, 3, 254)) return Toast.methods.addToast('Email must have between 3 and 254 characters.', 8000);
  36. // if (email.indexOf('@') !== email.lastIndexOf('@') || !validation.regex.emailSimple.test(email)) return Toast.methods.addToast('Invalid email format.', 8000);
  37. // if (!validation.isLength(username, 2, 32)) return Toast.methods.addToast('Username must have between 2 and 32 characters.', 8000);
  38. // if (!validation.regex.azAZ09_.test(username)) return Toast.methods.addToast('Invalid username format. Allowed characters: a-z, A-Z, 0-9 and _.', 8000);
  39. // if (!validation.isLength(password, 6, 200)) return Toast.methods.addToast('Password must have between 6 and 200 characters.', 8000);
  40. // if (!validation.regex.password.test(password)) return Toast.methods.addToast('Invalid password format. Must have one lowercase letter, one uppercase letter, one number and one special character.', 8000);
  41. socket.emit("users.register", this.state.username, this.state.email, this.state.password, grecaptcha.getResponse(this.state.recaptcha), res => {
  42. if (res.status === "success") {
  43. if (res.SID) {
  44. const date = new Date();
  45. date.setTime(new Date().getTime() + (2 * 365 * 24 * 60 * 60 * 1000));
  46. const secure = (config.cookie.secure) ? "secure=true; " : "";
  47. document.cookie = `SID=${ res.SID }; expires=${ date.toGMTString() }; domain=${ config.cookie.domain }; ${ secure }path=/`;
  48. location.reload(); // if we could avoid this, then that would be better
  49. } else {
  50. // redirect to login
  51. }
  52. } else {
  53. // return res.message, temporarily:
  54. alert(res.message); // eslint-disable-line no-alert
  55. }
  56. });
  57. });
  58. }
  59. render() {
  60. return (
  61. <div>
  62. <label htmlFor="email">Email</label>
  63. <input type="text" id="email" value={ this.state.email } onChange={ event => this.updateField("email", event) } />
  64. <label htmlFor="username">Username</label>
  65. <input type="text" id="username" value={ this.state.username } onChange={ event => this.updateField("username", event) } />
  66. <label htmlFor="password">Password</label>
  67. <input type="password" id="password" value={ this.state.password } onChange={ event => this.updateField("password", event) } />
  68. <div id="recaptcha" />
  69. <button onClick={ this.register }>Register</button>
  70. </div>
  71. );
  72. }
  73. }