// ** React Imports import { useState } from 'react' // ** MUI Imports import Drawer from '@mui/material/Drawer' import Select from '@mui/material/Select' import Button from '@mui/material/Button' import MenuItem from '@mui/material/MenuItem' import { styled } from '@mui/material/styles' import TextField from '@mui/material/TextField' import IconButton from '@mui/material/IconButton' import InputLabel from '@mui/material/InputLabel' import Typography from '@mui/material/Typography' import Box, { BoxProps } from '@mui/material/Box' import FormControl from '@mui/material/FormControl' import FormHelperText from '@mui/material/FormHelperText' // ** Third Party Imports import * as yup from 'yup' import { yupResolver } from '@hookform/resolvers/yup' import { useForm, Controller } from 'react-hook-form' // ** Icon Imports import Icon from 'src/@core/components/icon' // ** Store Imports import { useDispatch, useSelector } from 'react-redux' // ** Actions Imports import { addUser } from 'src/store/apps/user' // ** Types Imports import { RootState, AppDispatch } from 'src/store' import { UsersType } from 'src/types/apps/userTypes' interface SidebarAddUserType { open: boolean toggle: () => void } interface UserData { email: string company: string country: string contact: number fullName: string username: string } const showErrors = (field: string, valueLen: number, min: number) => { if (valueLen === 0) { return `${field} field is required` } else if (valueLen > 0 && valueLen < min) { return `${field} must be at least ${min} characters` } else { return '' } } const Header = styled(Box)(({ theme }) => ({ display: 'flex', alignItems: 'center', padding: theme.spacing(3, 4), justifyContent: 'space-between', backgroundColor: theme.palette.background.default })) const schema = yup.object().shape({ company: yup.string().required(), country: yup.string().required(), email: yup.string().email().required(), contact: yup .number() .typeError('Contact Number field is required') .min(10, obj => showErrors('Contact Number', obj.value.length, obj.min)) .required(), fullName: yup .string() .min(3, obj => showErrors('First Name', obj.value.length, obj.min)) .required(), username: yup .string() .min(3, obj => showErrors('Username', obj.value.length, obj.min)) .required() }) const defaultValues = { email: '', company: '', country: '', fullName: '', username: '', contact: Number('') } const SidebarAddUser = (props: SidebarAddUserType) => { // ** Props const { open, toggle } = props // ** State const [plan, setPlan] = useState('basic') const [role, setRole] = useState('subscriber') // ** Hooks const dispatch = useDispatch() const store = useSelector((state: RootState) => state.user) const { reset, control, setValue, setError, handleSubmit, formState: { errors } } = useForm({ defaultValues, mode: 'onChange', resolver: yupResolver(schema) }) const onSubmit = (data: UserData) => { if (store.allData.some((u: UsersType) => u.email === data.email || u.username === data.username)) { store.allData.forEach((u: UsersType) => { if (u.email === data.email) { setError('email', { message: 'Email already exists!' }) } if (u.username === data.username) { setError('username', { message: 'Username already exists!' }) } }) } else { dispatch(addUser({ ...data, role, currentPlan: plan })) toggle() reset() } } const handleClose = () => { setPlan('basic') setRole('subscriber') setValue('contact', Number('')) toggle() reset() } return (
Add User
( )} /> {errors.fullName && {errors.fullName.message}} ( )} /> {errors.username && {errors.username.message}} ( )} /> {errors.email && {errors.email.message}} ( )} /> {errors.company && {errors.company.message}} ( )} /> {errors.country && {errors.country.message}} ( )} /> {errors.contact && {errors.contact.message}} Select Role Select Plan
) } export default SidebarAddUser