'use client'; import * as Yup from 'yup'; import { useEffect, 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, FormControl, FormControlLabel, Select, MenuItem, Button } from '@mui/material'; import { LoadingButton } from '@mui/lab'; // icons import { MdOutlineVisibility, MdLock, MdOutlineVisibilityOff } from 'react-icons/md'; import { IoMdMail } from 'react-icons/io'; import { lang, langen, langjp } from '../lang/kr'; import getCookies from '../lang/langUtil'; import { Row } from '../customElements'; export default function LoginForm() { const langIs = getCookies('lang'); 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 [langState, setLangState] = useState(langIs ? langIs : 'kr') 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; useEffect(() => { createCookies('lang', langState) }, [langState]); return ( <> {({ kr: lang, en: langen, jp: langjp }[langIs] || lang).login} {({ kr: lang, en: langen, jp: langjp }[langIs] || lang)["Select Language"]}
{({ kr: lang, en: langen, jp: langjp }[langIs] || lang).Email} ) }} /> {({ kr: lang, en: langen, jp: langjp }[langIs] || lang).Password} ), endAdornment: ( setShowPassword((prev) => !prev)}> {showPassword ? : } ) }} error={Boolean(touched.password && errors.password)} helperText={touched.password && errors.password} /> } label={({ kr: lang, en: langen, jp: langjp }[langIs] || lang)['Remember me']} /> {({ kr: lang, en: langen, jp: langjp }[langIs] || lang)['Forgot password']} {({ kr: lang, en: langen, jp: langjp }[langIs] || lang).login} {({ kr: lang, en: langen, jp: langjp }[langIs] || lang).vendor} {' '} {({ kr: lang, en: langen, jp: langjp }[langIs] || lang).Register} {({ kr: lang, en: langen, jp: langjp }[langIs] || lang).buyer} {' '} {({ kr: lang, en: langen, jp: langjp }[langIs] || lang).Register} {({ kr: lang, en: langen, jp: langjp }[langIs] || lang)['customer service']}
); }