import { useQuery } from '@tanstack/react-query'; import { useState, type FormEvent } from 'react'; import { useTranslation } from 'react-i18next'; import { useSession } from '../app/session'; import { useErrorText } from '../shared/lib/errors'; import { Button, Field, FormError } from '../shared/ui/ui'; import { AuthLayout } from './AuthLayout'; import s from './auth.module.css'; export function LoginPage() { const { t } = useTranslation(['auth', 'common']); const session = useSession(); const errorText = useErrorText(); const [username, setUsername] = useState(''); const [password, setPassword] = useState(''); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const info = useQuery({ queryKey: ['server-info'], queryFn: async () => (await session.client.GET('/api/v1/server-info')).data ?? null, }); const submit = async (e: FormEvent) => { e.preventDefault(); setBusy(true); setError(null); try { // Переход выполнит роутер: смена состояния сессии пересчитывает guards. await session.login(username.trim(), password); } catch (err) { setError(err); setPassword(''); setBusy(false); } }; return (

{t('login.title')}

{t('login.subtitle')}

{info.data?.bootstrap_required &&
{t('login.bootstrap_hint')}
}
void submit(e)} noValidate> {error ? errorText(error) : null}
); }