'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'; import { lang } from '../lang/kr'; // 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 } 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(lang['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(lang['Enter valid email']).required(lang['Email is required']), password: Yup.string() .required(lang['Password is required']) .min(8, lang['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, values, handleSubmit, getFieldProps } = formik; return ( <>
{lang.Email} ) }} /> {lang.Password} ), endAdornment: ( setShowPassword((prev) => !prev)}> {showPassword ? : } ) }} error={Boolean(touched.password && errors.password)} helperText={touched.password && errors.password} /> } label={lang['Remember me']} /> {lang['Forgot password']} {lang.login} {lang.Register}
); }