'use client' // React Imports import { useState } from 'react' // Next Imports import Link from 'next/link' import { useParams, useRouter, useSearchParams } from 'next/navigation' // MUI Imports import Card from '@mui/material/Card' import CardContent from '@mui/material/CardContent' import Typography from '@mui/material/Typography' import IconButton from '@mui/material/IconButton' import InputAdornment from '@mui/material/InputAdornment' import Checkbox from '@mui/material/Checkbox' import Button from '@mui/material/Button' import FormControlLabel from '@mui/material/FormControlLabel' import Divider from '@mui/material/Divider' import { CircularProgress } from '@mui/material' // Third-party Imports import { Controller, useForm } from 'react-hook-form' import { valibotResolver } from '@hookform/resolvers/valibot' import { email, object, minLength, string, pipe, nonEmpty } from 'valibot' import type { SubmitHandler } from 'react-hook-form' import type { InferInput } from 'valibot' import { toast } from 'react-toastify' // Type Imports import type { Locale } from '@configs/i18n' // Component Imports import Logo from '@components/layout/shared/Logo' import CustomTextField from '@core/components/mui/TextField' // Config Imports import themeConfig from '@configs/themeConfig' // Util Imports import { getLocalizedUrl } from '@/utils/i18n' import { useAuthMutation } from '../services/mutations/auth' // Styled Component Imports import AuthIllustrationWrapper from './AuthIllustrationWrapper' type ErrorType = { message: string[] } type FormData = InferInput const schema = object({ email: pipe(string(), minLength(1, 'This field is required'), email('Email is invalid')), password: pipe( string(), nonEmpty('This field is required'), minLength(5, 'Password must be at least 5 characters long') ) }) const Login = () => { // States const [isPasswordShown, setIsPasswordShown] = useState(false) const [errorState, setErrorState] = useState(null) const { login } = useAuthMutation() // Hooks const router = useRouter() const searchParams = useSearchParams() const { lang: locale } = useParams() const { control, handleSubmit, formState: { errors } } = useForm({ resolver: valibotResolver(schema), defaultValues: { email: '', password: '' } }) const handleClickShowPassword = () => setIsPasswordShown(show => !show) const onSubmit: SubmitHandler = async (data: FormData) => { login.mutate(data, { onSuccess: (data: any) => { if (data?.user?.role === 'admin') { const redirectURL = searchParams.get('redirectTo') ?? '/dashboards/overview' router.replace(getLocalizedUrl(redirectURL, locale as Locale)) } else { const redirectURL = searchParams.get('redirectTo') ?? '/sa/organizations/list' router.replace(getLocalizedUrl(redirectURL, locale as Locale)) } }, onError: (error: any) => { toast.error(error.response.data.message) } }) } return (
{`Welcome to ${themeConfig.templateName}! 馃憢馃徎`} Please sign-in to your account and start the adventure
( { field.onChange(e.target.value) errorState !== null && setErrorState(null) }} {...((errors.email || errorState !== null) && { error: true, helperText: errors?.email?.message || errorState?.message[0] })} /> )} /> ( { field.onChange(e.target.value) errorState !== null && setErrorState(null) }} slotProps={{ input: { endAdornment: ( e.preventDefault()} > ) } }} {...(errors.password && { error: true, helperText: errors.password.message })} /> )} />
} label='Remember me' /> Forgot password?
New on our platform? Create an account
or
) } export default Login