Skip to content
Snippets Groups Projects
SignUpForm.tsx 5.12 KiB
Newer Older
Defendi Alberto's avatar
Defendi Alberto committed
import React, { FC } from 'react';
import { SubmitHandler, useForm } from 'react-hook-form';
import { Button } from '@material-ui/core';
import axios from 'axios';
import { InputField } from 'components/Auth/InputField/InputField';
import { useStyles } from 'components/Auth/SignUpForm/useStyles';
// TODO: Data validation
// TODO: Replace notes with big input field
Defendi Alberto's avatar
Defendi Alberto committed
export const SignUpForm: FC = () => {
  type FormData = {
    username: string;
    password: string;
    firstName: string;
    lastName: string;
    email: string;
    phoneNumber: number;
    address: number;
    name: string;
    memberCardNumber: number;
    notes: string;
Defendi Alberto's avatar
Defendi Alberto committed

  const { control, errors, handleSubmit } = useForm<FormData>();
Defendi Alberto's avatar
Defendi Alberto committed

  const onSubmit: SubmitHandler<FormData> = (values: FormData) => {
    axios.post(
      '/api/web/seniors/',
      {
        user: {
          username: values.username,
          password: values.password,
          firstName: values.firstName,
          lastName: values.lastName,
          email: values.email,
        },
        phone_number: values.phoneNumber,
        home_address: {
          address: values.address,
        member_card_issuer: {
          name: values.memberCardNumber,
        member_card_number: values.memberCardNumber,
        notes: values.notes,
      },
      {
        headers: {
          'Content-Type': 'application/json',
        },
      },
    );
Defendi Alberto's avatar
Defendi Alberto committed
  };

  const classes = useStyles();
  return (
    <>
      <form
        className={classes.form}
        onSubmit={handleSubmit(onSubmit)}
        data-testid="Form"
      >
        <InputField
          name="email"
          control={control}
          rules={{
            validate: (value: string) =>
              /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i.test(value),
            required: {
              value: true,
              message: 'Email is not valid',
            },
          }}
          label="Email"
          error={!!errors.email}
Defendi Alberto's avatar
Defendi Alberto committed
          errorMessage="Insert email"
        />

        <InputField
          name="password"
          control={control}
          rules={{
            minLength: 8,
            maxLength: 60,
            required: {
              value: true,
              message: 'Insert valid password',
            },
          }}
          label="Password"
          error={!!errors.password}
Defendi Alberto's avatar
Defendi Alberto committed
          errorMessage="Insert valid password"
        />

        <InputField
          name="username"
          control={control}
          rules={{
            maxLength: 150,
            required: {
              value: true,
              message: 'Insert valid username',
            },
          }}
          label="Username"
          error={!!errors.username}
          errorMessage="Insert valid username"
        />

        <InputField
          name="firstName"
          control={control}
          rules={{
            maxLength: 150,
            required: {
              value: true,
              message: 'Insert valid first name',
            },
          }}
          label="First name"
          error={!!errors.firstName}
          errorMessage="Insert valid first name"
        />

        <InputField
          name="lastName"
          control={control}
          rules={{
            maxLength: 150,
            required: {
              value: true,
              message: 'Insert valid last name',
            },
          }}
          label="Last name"
          error={!!errors.lastName}
          errorMessage="Insert valid last name"
        />

        <InputField
          name="address"
          control={control}
          rules={{
            required: {
              value: true,
              message: 'Insert valid address',
            },
          }}
          label="Address"
          error={!!errors.address}
          errorMessage="Insert valid address"
        />

        <InputField
          name="phoneNumber"
          control={control}
          rules={{
            maxLength: 15,
            required: {
              value: true,
              message: 'Insert valid phone number',
            },
          }}
          label="Phone number"
          error={!!errors.phoneNumber}
          errorMessage="Insert valid phone number"
        />

        <InputField
          name="memberCardNumber"
          control={control}
          rules={{
            maxLength: 20,
            required: {
              value: true,
              message: 'Insert valid card number',
            },
          }}
          label="Card number"
          error={!!errors.memberCardNumber}
          errorMessage="Insert valid card number"
        />

        <InputField
          name="notes"
          control={control}
          rules={{
            required: {
              value: true,
              message: 'Add notes',
            },
          }}
          label="Notes"
          error={!!errors.notes}
          errorMessage="Insert notes"
        />

Defendi Alberto's avatar
Defendi Alberto committed
        <Button
          data-testid="Submit"
          type="submit"
          fullWidth
          variant="contained"
          color="primary"
          className={classes.submit}
        >
          Sign Up
        </Button>
      </form>
    </>
  );
};