import { Alert, AlertDescription, AlertIcon, Box, Button, chakra, FormControl, HStack, Text, VStack, } from '@chakra-ui/react'; import { ArrowRightStartOnRectangleIcon } from '@heroicons/react/24/outline'; import { zodResolver } from '@hookform/resolvers/zod'; import { FC, useEffect, useState } from 'react'; import { FieldValues, useForm } from 'react-hook-form'; import { useLocation, useNavigate } from 'react-router-dom'; import { z } from 'zod'; import { Footer } from 'components/footer'; import { Input } from 'components/input'; import { fetch } from 'service/http'; import { ReactComponent as Logo } from 'assets/logo.svg'; import { useTranslation } from 'react-i18next'; import { Language } from 'components/language'; import { useAdmin } from 'stores'; const schema = z.object({ username: z.string().min(1, 'login.fieldRequired'), password: z.string().min(1, 'login.fieldRequired'), }); export const LogoIcon = chakra(Logo, { baseStyle: { strokeWidth: '10px', w: 12, h: 12, }, }); const LoginIcon = chakra(ArrowRightStartOnRectangleIcon, { baseStyle: { w: 5, h: 5, strokeWidth: '2px', }, }); export const Login: FC = () => { const [error, setError] = useState(''); const [loading, setLoading] = useState(false); const navigate = useNavigate(); const { setAuthToken, removeAuthToken } = useAdmin(); const { t } = useTranslation(); let location = useLocation(); const { register, formState: { errors }, handleSubmit, } = useForm({ resolver: zodResolver(schema), }); useEffect(() => { removeAuthToken(); if (location.pathname !== '/login') { navigate('/login', { replace: true }); } }, []); const login = (values: FieldValues) => { setError(''); const formData = new FormData(); formData.append('username', values.username); formData.append('password', values.password); formData.append('grant_type', 'password'); setLoading(true); fetch('/admins/token', { method: 'post', body: formData }) .then(({ access_token: token }) => { setAuthToken(token); navigate('/'); }) .catch((err) => { setError(err.response._data.detail); }) .finally(setLoading.bind(null, false)); }; return ( {t('login.loginYourAccount')} {t('login.welcomeBack')}
{error && ( {error} )}