Guest User

Untitled

a guest
Feb 7th, 2019
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import "./Register.scss";
  2.  
  3. import * as React from "react";
  4. import {Form, Icon, Input, Button, Alert, Select} from "antd";
  5. import { WrappedFormUtils } from "antd/lib/form/Form";
  6. import { FormattedMessage } from "react-intl";
  7. import { inject } from "mobx-react";
  8. import * as shajs from "js-sha256";
  9. import autobind from "autobind-decorator";
  10.  
  11. import BemUtil from "Utils/BEMUtil";
  12.  
  13. import ApiService from "Services/ApiService";
  14.  
  15. import {EUserRegisterError, IUserRegisterRequest, IUserRegisterResponse} from "Interfaces/Api/User/Register";
  16. import {IApiResponse} from "Interfaces/Api/Response";
  17.  
  18. const Option = Select.Option;
  19.  
  20. interface IRegisterProps {
  21.     form: WrappedFormUtils;
  22.     ApiService?: ApiService;
  23. }
  24.  
  25. interface IRegisterState {
  26.     registered: boolean;
  27.     error: JSX.Element;
  28.     loading: boolean;
  29. }
  30.  
  31. @inject("ApiService")
  32. class Register extends React.Component<IRegisterProps, IRegisterState> {
  33.  
  34.     private readonly blockName = "register";
  35.  
  36.     public constructor(props: IRegisterProps) {
  37.         super(props);
  38.  
  39.         this.state = {
  40.             registered: false,
  41.             error: null,
  42.             loading: false
  43.         };
  44.     }
  45.  
  46.     public render() {
  47.         return !this.state.registered ?
  48.             this.renderRegister() :
  49.             this.renderRegistered();
  50.     }
  51.  
  52.     private renderRegister(): JSX.Element {
  53.  
  54.         return <Form onSubmit={this.handleSubmit} className={this.blockName}>
  55.             {this.renderError()}
  56.             {this.renderFormElements()}
  57.             <Form.Item>
  58.                 <Button
  59.                     type="primary"
  60.                     htmlType="submit"
  61.                     className={BemUtil.getElement(this.blockName, "submit")}
  62.                     loading={this.state.loading}
  63.                 >
  64.                     <FormattedMessage
  65.                         id="auth.login.register_button"
  66.                         defaultMessage="Register"
  67.                     />
  68.                 </Button>
  69.             </Form.Item>
  70.         </Form>;
  71.     }
  72.  
  73.     private renderRegistered() {
  74.         return <Alert
  75.             message={this.registeredTitle}
  76.             type="success"
  77.             description={this.registeredText}
  78.             showIcon
  79.         />;
  80.     }
  81.  
  82.     private renderError() {
  83.         return this.state.error ?
  84.             <Form.Item>
  85.                 {this.state.error &&
  86.                 <Alert
  87.                     message={this.errorTitle}
  88.                     type="error"
  89.                     description={this.state.error}
  90.                     showIcon
  91.                     closable
  92.                 />
  93.                 }
  94.             </Form.Item> :
  95.             null;
  96.  
  97.     }
  98.  
  99.     private renderFormElements() {
  100.         const { getFieldDecorator } = this.props.form;
  101.  
  102.         return [
  103.             <Form.Item>
  104.                 {getFieldDecorator("username", {
  105.                     rules: [{
  106.                         required: true,
  107.                         message: this.getErrorMessage("username"),
  108.                         pattern: /[A-Z0-9_-]/i
  109.                     }],
  110.                     validateTrigger: ""
  111.                 })(
  112.                     <Input prefix={<Icon type="user" />} placeholder="Username" disabled={this.state.loading} />
  113.                 )}
  114.             </Form.Item>,
  115.             <Form.Item>
  116.                 {getFieldDecorator("password", {
  117.                     rules: [{
  118.                         required: true,
  119.                         message: this.getErrorMessage("password")
  120.                     }]
  121.                 })(
  122.                     <Input
  123.                         prefix={<Icon type="lock" />}
  124.                         type="password"
  125.                         placeholder="Password"
  126.                         disabled={this.state.loading}
  127.                     />
  128.                 )}
  129.             </Form.Item>,
  130.             <Form.Item>
  131.                 {getFieldDecorator("position", {
  132.                     rules: [{
  133.                         required: true,
  134.                         message: this.getErrorMessage("position")
  135.                     }]
  136.                 })(
  137.                     <Select placeholder="Position">
  138.                         {this.renderPositionOptions()}
  139.                     </Select>
  140.                 )}
  141.             </Form.Item>
  142.         ];
  143.     }
  144.  
  145.     private renderPositionOptions() {
  146.         return [
  147.             <Option value="1">
  148.                 <FormattedMessage
  149.                     id="auth.register.organizer"
  150.                     defaultMessage="Organizer"
  151.                 />
  152.             </Option>,
  153.             <Option value="2">
  154.                 <FormattedMessage
  155.                     id="auth.register.ambassador"
  156.                     defaultMessage="Ambassador"
  157.                 />
  158.             </Option>,
  159.             <Option value="3">
  160.                 <FormattedMessage
  161.                     id="auth.register.volunteer"
  162.                     defaultMessage="Volunteer"
  163.                 />
  164.             </Option>,
  165.             <Option value="4">
  166.                 <FormattedMessage
  167.                     id="auth.register.Riot"
  168.                     defaultMessage="Riot"
  169.                 />
  170.             </Option>
  171.         ];
  172.     }
  173.  
  174.     private get errorTitle() {
  175.         return <FormattedMessage
  176.             id="auth.register.error_title"
  177.             defaultMessage="Something went wrong"
  178.         />;
  179.     }
  180.  
  181.     private get registeredTitle() {
  182.         return <FormattedMessage
  183.             id="auth.register.success_title"
  184.             defaultMessage="One last step"
  185.         />;
  186.     }
  187.  
  188.     private get registeredText() {
  189.         return <FormattedMessage
  190.             id="auth.register.success"
  191.             defaultMessage="You have successfully registered your account. Please wait until it gets activated."
  192.         />;
  193.     }
  194.  
  195.     private getErrorMessage(field: string) {
  196.         const fields: {[index: string]: JSX.Element} = {
  197.             username: <FormattedMessage
  198.                 id="auth.login.username_error"
  199.                 defaultMessage="Please enter a valid username"
  200.             />,
  201.             password: <FormattedMessage
  202.                 id="auth.login.password_error"
  203.                 defaultMessage="Please enter a valid password"
  204.             />,
  205.             position: <FormattedMessage
  206.                 id="auth.login.password_error"
  207.                 defaultMessage="Please enter a valid password"
  208.             />
  209.         };
  210.  
  211.         return fields[field];
  212.     }
  213.  
  214.     private getRegisterError(code: string) {
  215.         const errors: { [index: string]: JSX.Element } = {
  216.             exists: <FormattedMessage
  217.                 id="auth.register.error_exists"
  218.                 defaultMessage="This username is already associated to an account"
  219.             />,
  220.             serverFault: <FormattedMessage
  221.                 id="auth.register.server_fault"
  222.                 defaultMessage="Could not register you"
  223.             />,
  224.             badFormat: <FormattedMessage
  225.                 id="auth.register.error_bad_format"
  226.                 defaultMessage="Please check your input and try again"
  227.             />
  228.         };
  229.  
  230.         return errors[code];
  231.     }
  232.  
  233.     private setErrorState() {
  234.         this.setState({
  235.             loading: false,
  236.             error: this.getRegisterError("badFormat")
  237.         });
  238.     }
  239.  
  240.     private setLoading(loading: boolean = true) {
  241.         this.setState({
  242.             loading
  243.         });
  244.     }
  245.  
  246.     private handleSubmit = (e: any) => {
  247.         e.preventDefault();
  248.  
  249.         this.setState({
  250.             registered: false,
  251.             error: null
  252.         });
  253.  
  254.         this.props.form.validateFields((err: any, values: any) => {
  255.             if (!err) {
  256.                 this.setLoading();
  257.  
  258.                 const data = this.getInputData(values);
  259.  
  260.                 this.props.ApiService.user.register.send(data)
  261.                     .then(this.handleRegisterResponse)
  262.                     .catch(this.handleRegisterReject);
  263.             } else {
  264.                 this.setErrorState();
  265.             }
  266.         });
  267.     }
  268.  
  269.     @autobind
  270.     private handleRegisterResponse(response: IApiResponse<IUserRegisterResponse>) {
  271.  
  272.         const {data, error} = response;
  273.  
  274.         this.setLoading(false);
  275.  
  276.         if (error) {
  277.             switch (error.status) {
  278.                 case EUserRegisterError.EXISTS:
  279.                     this.setState({
  280.                         error: this.getRegisterError("exists")
  281.                     });
  282.                     break;
  283.                 case EUserRegisterError.WRONG_INPUT:
  284.                     this.setState({
  285.                         error: this.getRegisterError("badFormat")
  286.                     });
  287.                     break;
  288.                 case EUserRegisterError.UNKNOWN:
  289.                     this.setState({
  290.                         error: this.getRegisterError("serverFault")
  291.                     });
  292.                     break;
  293.             }
  294.  
  295.             return;
  296.         }
  297.  
  298.         if (data.success) {
  299.             this.setState({
  300.                 registered: true
  301.             });
  302.             return;
  303.         }
  304.     }
  305.  
  306.     @autobind
  307.     private handleRegisterReject() {
  308.  
  309.         this.setErrorState();
  310.     }
  311.  
  312.     private getInputData(values: any): IUserRegisterRequest {
  313.         return {
  314.             username: values.username,
  315.             password: shajs.sha256(values.password),
  316.             position: values.position
  317.         };
  318.     }
  319. }
  320.  
  321. const RegisterForm = Form.create()(Register);
  322. export default RegisterForm;
Add Comment
Please, Sign In to add comment