'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 ErrorField from '@/components/ui/ErrorField'; import SubmitButton from '@/components/ui/SubmitButton'; import TextInput from '@/components/ui/TextInput'; import TextURL from '@/components/ui/TextURL'; 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, setError, resetField, formState: { errors } } = useForm({ resolver: zodResolver(UserLoginSchema), defaultValues: { username: initialName, password: '' } }); const { isAnonymous } = useAuthSuspense(); const { login, isPending, error: loginError, reset } = useLogin(); function onSubmit(data: IUserLoginDTO) { login( data, () => { resetField('password'); if (router.canBack()) { router.back(); } else { router.push(urls.library); } }, error => { if (axios.isAxiosError(error) && error.response && error.response.status === 400) { setError('root', { message: 'На Портале отсутствует такое сочетание имени пользователя и пароля' }); } } ); } function resetErrors() { reset(); clearErrors(); } if (!isAnonymous) { return ; } return (
void handleSubmit(onSubmit)(event)} onChange={resetErrors} > Концепт Портал
); } export default LoginPage; // ====== Internals ========= function EscalateError({ error }: { error: ErrorData }): React.ReactElement | null { // TODO: rework error escalation mechanism. Probably make it global. if (!error) { return null; } if (axios.isAxiosError(error) && error.response && error.response.status === 400) { return null; } throw error as Error; }