'use client';
import * as Yup from 'yup';
import { useState } from 'react';
import { useMutation } from 'react-query';
import RouterLink from 'next/link';
import { useSearchParams } from 'next/navigation';
import { useRouter } from 'next-nprogress-bar';
import toast from 'react-hot-toast';
// formik
import { useFormik, Form, FormikProvider } from 'formik';
// cookies
import { createCookies } from 'src/hooks/cookies';
// redux
import { useDispatch } from 'react-redux';
import { setWishlist } from 'src/redux/slices/wishlist';
import { setLogin } from 'src/redux/slices/user';
// api
import * as api from 'src/services';
// mui
import {
Link,
Typography,
Stack,
Checkbox,
TextField,
IconButton,
InputAdornment,
FormControlLabel,
Button,
Alert,
AlertTitle
} from '@mui/material';
import { LoadingButton } from '@mui/lab';
// icons
import { MdOutlineVisibility, MdLock, MdOutlineVisibilityOff } from 'react-icons/md';
import { IoMdMail } from 'react-icons/io';
export default function LoginForm() {
const { push } = useRouter();
const dispatch = useDispatch();
const searchParam = useSearchParams();
const redirect = searchParam.get('redirect');
const [loading, setloading] = useState(false);
const [showPassword, setShowPassword] = useState(false);
const { mutate } = useMutation(api.login, {
onSuccess: async (data) => {
dispatch(setLogin(data.user));
dispatch(setWishlist(data.user.wishlist));
await createCookies('token', data.token);
setloading(false);
toast.success('Logged in successfully!');
const isAdmin = data.user.role.includes('admin');
const isVendor = data.user.role.includes('vendor');
push(redirect || isAdmin ? '/admin/dashboard' : isVendor ? '/vendor/dashboard' : '/');
},
onError: (err) => {
setloading(false);
toast.error(err.response.data.message);
}
});
const LoginSchema = Yup.object().shape({
email: Yup.string().email('Enter valid email').required('Email is required.'),
password: Yup.string().required('Password is required.').min(8, 'Password should be 8 characters or longer.')
});
const formik = useFormik({
initialValues: {
email: '',
password: '',
remember: true
},
validationSchema: LoginSchema,
onSubmit: async (values) => {
const { email, password } = values;
setloading(true);
mutate({ email, password });
}
});
const { errors, touched, setFieldValue, values, handleSubmit, getFieldProps } = formik;
return (
<>
{
setFieldValue('email', 'admin@nextall.com');
setFieldValue('password', 'test1234');
}}
>
Copy
}
>
Admin
Email: admin@test.com | password: test1234
{
setFieldValue('email', 'vendor@nextall.com');
setFieldValue('password', 'test1234');
}}
>
Copy
}
>
Vendor
Email: vendor@test.com | password: test1234
>
);
}