'use client'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import clsx from 'clsx'; import { urls, useConceptNavigation } from '@/app'; import { isAxiosError } from '@/backend/apiTransport'; import { SubmitButton, TextURL } from '@/components/Control'; import { type ErrorData } from '@/components/InfoError'; import { TextInput } from '@/components/Input'; import { useQueryStrings } from '@/hooks/useQueryStrings'; import { resources } from '@/utils/constants'; import { type IUserLoginDTO, schemaUserLogin } from '../backend/types'; import { useAuthSuspense } from '../backend/useAuth'; import { useLogin } from '../backend/useLogin'; import { ExpectedAnonymous } from '../components/ExpectedAnonymous'; export function LoginPage() { const router = useConceptNavigation(); const query = useQueryStrings(); const initialName = query.get('username') ?? ''; const { register, handleSubmit, clearErrors, formState: { errors } } = useForm({ resolver: zodResolver(schemaUserLogin), defaultValues: { username: initialName, password: '' } }); const { isAnonymous } = useAuthSuspense(); const { login, isPending, error: serverError, reset: clearServerError } = useLogin(); function onSubmit(data: IUserLoginDTO) { return login(data).then(() => { 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} ); } // ====== Internals ========= function ServerError({ error }: { error: ErrorData }): React.ReactElement | null { if (isAxiosError(error) && error.response && error.response.status === 400) { return (
На Портале отсутствует такое сочетание имени пользователя и пароля
); } throw error as Error; }