import { unwrap } from '@pipu/core'; import { useState, type FormEvent } from 'react'; import { useTranslation } from 'react-i18next'; import { useAuthState, useSession, useUser } from '../app/session'; import { useErrorText, useFieldError } from '../shared/lib/errors'; import { lockResetIcon, shieldIcon } from '../shared/ui/icons'; import { Button, Field, FormError, Icon } from '../shared/ui/ui'; import { AuthLayout } from './AuthLayout'; import s from './auth.module.css'; /** Обязательный шаг после входа: новые логин и пароль админа (admin) или замена временного пароля (password). */ export function SetupPage({ variant }: { variant: 'admin' | 'password' }) { return useAuthState().status === 'signed_in' ? : null; } function SetupForm({ variant }: { variant: 'admin' | 'password' }) { const { t } = useTranslation(['auth', 'common']); const session = useSession(); const user = useUser(); const errorText = useErrorText(); const fieldError = useFieldError(); const admin = variant === 'admin'; const minLength = user.role === 'user' ? 8 : 12; const [username, setUsername] = useState(user.username); const [password, setPassword] = useState(''); const [repeat, setRepeat] = useState(''); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const mismatch = repeat !== '' && repeat !== password; const submit = async (e: FormEvent) => { e.preventDefault(); if (mismatch) return; setBusy(true); setError(null); try { const res = admin ? await session.client.POST('/api/v1/me/bootstrap-credentials', { body: { new_username: username.trim(), new_password: password }, }) : await session.client.POST('/api/v1/me/password', { body: { new_password: password } }); await session.apply(unwrap(res)); } catch (err) { setError(err); setBusy(false); } }; const usernameError = fieldError(error, 'new_username'); const passwordError = fieldError(error, 'new_password'); const generalError = error && !usernameError && !passwordError ? errorText(error) : null; return ( {t(admin ? 'setup.admin_badge' : 'setup.password_badge')}

{t(admin ? 'setup.admin_title' : 'setup.password_title')}

{t(admin ? 'setup.admin_text' : 'setup.password_text')}

void submit(e)} noValidate> {admin && ( )} {generalError}
); }