'use client'; import { zodResolver } from '@hookform/resolvers/zod'; import axios from 'axios'; import clsx from 'clsx'; import { useForm } from 'react-hook-form'; import { useConceptNavigation } from '@/app/Navigation/NavigationContext'; import { urls } from '@/app/urls'; import { IUserLoginDTO, UserLoginSchema } from '@/backend/auth/api'; import { useAuthSuspense } from '@/backend/auth/useAuth'; import { useLogin } from '@/backend/auth/useLogin'; import ExpectedAnonymous from '@/components/ExpectedAnonymous'; import { ErrorData } from '@/components/info/InfoError'; import { SubmitButton, TextURL } from '@/components/ui/Control'; import { TextInput } from '@/components/ui/Input'; import useQueryStrings from '@/hooks/useQueryStrings'; import { resources } from '@/utils/constants'; function LoginPage() { const router = useConceptNavigation(); const query = useQueryStrings(); const initialName = query.get('username') ?? ''; const { register, handleSubmit, clearErrors, resetField, formState: { errors } } = useForm({ resolver: zodResolver(UserLoginSchema), defaultValues: { username: initialName, password: '' } }); const { isAnonymous } = useAuthSuspense(); const { login, isPending, error: serverError, reset: clearServerError } = useLogin(); function onSubmit(data: IUserLoginDTO) { login(data, () => { resetField('password'); if (router.canBack()) { router.back(); } else { router.push(urls.library); } }); } function resetErrors() { clearServerError(); clearErrors(); } if (!isAnonymous) { return ; } return (
void handleSubmit(onSubmit)(event)} onChange={resetErrors} > Концепт Портал
{serverError ? : null} ); } export default LoginPage; // ====== Internals ========= function ServerError({ error }: { error: ErrorData }): React.ReactElement | null { if (axios.isAxiosError(error) && error.response && error.response.status === 400) { return (
На Портале отсутствует такое сочетание имени пользователя и пароля
); } throw error as Error; }