tieme-ndo/frontend

View on GitHub
src/components/pages/AddStaff/AddStaff.js

Summary

Maintainability
C
1 day
Test Coverage
import React from 'react';
import { useState } from 'react';

import { registrationHandler } from '../../../utils/handlers/authenticationHandlers';
import AddStaffForm from './AddStaffForm';
import validateAddStaffForm from './AddStaffValidation';
import { toast } from 'react-toastify';

function AddStaff() {
  const [state, updateState] = useState({
    username: '',
    password: '',
    confirmPassword: '',
    isAdmin: false,
    createAccount: false,
    errors: {}
  });

  const handleChange = (e, { name, value }) => {
    updateState(prevState => ({
      ...prevState,
      [name]: value
    }));
  };

  const checkboxChange = (e, { name, checked }) => {
    updateState(prevState => ({ ...prevState, isAdmin: checked }));
  };

  const handleSubmit = async () => {
    updateState(prevState => {
      return {
        ...prevState,
        createAccount: true
      };
    });

    const credential = {
      username: state.username,
      password: state.password,
      confirmPassword: state.confirmPassword
    };

    const { errors, isValid } = await validateAddStaffForm(credential);

    if (!isValid) {
      return updateState(prevState => ({
        ...prevState,
        createAccount: false,
        errors
      }));
    }

    if(!/^[a-z0-9]+$/.test(state.username)){
      return updateState(prevState => ({
        ...prevState,
        createAccount: false,
        errors: [{username: 'Non-alphanumeric characters are not allowed. Capital letters not allowed'}]
      }));
    }

    if (state.password !== state.confirmPassword) {
      return updateState(prevState => ({
        ...prevState,
        createAccount: false,
        password: '',
        confirmPassword: '',
        errors: [{ password: 'Passwords do not match' }]
      }));
    }

    try {
      const response = await registrationHandler({
        username: state.username,
        password: state.password,
        isAdmin: state.isAdmin
      });
      if (Array.isArray(response)) {
        const [errors] = response;

        toast.error(errors.message);

        return updateState(prevState => ({
          ...prevState,
          createAccount: false
        }));
      } else if (response && response.message === 'username already exists') {
        toast.error('username already exists');

        return updateState(prevState => ({
          ...prevState,
          createAccount: false,
          errors: {}
        }));
      } else if (response === 'New user created') {
        toast.success('New user created');

        return updateState(prevState => ({
          ...prevState,
          username: '',
          password: '',
          confirmPassword: '',
          isAdmin: false,
          createAccount: false
        }));
      }
    } catch (error) {
      updateState(prevState => ({
        ...prevState,
        createAccount: false
      }));
    }
  };

  return (
    <AddStaffForm
      state={state}
      handleSubmit={handleSubmit}
      handleChange={handleChange}
      checkboxChange={checkboxChange}
    />
  );
}

export default AddStaff;