'use client'; import axios from 'axios'; import clsx from 'clsx'; import { useState } from 'react'; import { useConceptNavigation } from '@/app/Navigation/NavigationContext'; import { urls } from '@/app/urls'; import { 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 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 { isAnonymous } = useAuthSuspense(); const { login, isPending, error: loginError, reset } = useLogin(); const [validationError, setValidationError] = useState(undefined); function handleSubmit(event: React.FormEvent) { event.preventDefault(); if (!isPending) { const formData = new FormData(event.currentTarget); const result = UserLoginSchema.safeParse({ username: formData.get('username'), password: formData.get('password') }); if (!result.success) { setValidationError(result.error); } else { login(result.data, () => { if (router.canBack()) { router.back(); } else { router.push(urls.library); } }); } } } function resetErrors() { reset(); setValidationError(undefined); } if (!isAnonymous) { return ; } return (
Концепт Портал
{!!loginError || !!validationError ? : null} ); } export default LoginPage; // ====== Internals ========= function ProcessError({ error }: { error: ErrorData }): React.ReactElement { if (axios.isAxiosError(error) && error.response && error.response.status === 400) { return (
На Портале отсутствует такое сочетание имени пользователя и пароля
); } throw error as Error; }