import { Alert, Button, Form, Input } from 'antd'; import { useState } from 'react'; import { api } from '../api/client'; import type { DevTokenResponse } from '../api/types'; import { setToken } from './token'; type Props = { onLogin: () => void; error?: string | null }; // Вход по email для разработки: бэкенд выпускает токен только при AUTH_DEV_ISSUER=true и DEBUG=true. function DevLoginForm({ onLogin, error }: Props) { const [submitting, setSubmitting] = useState(false); const [failure, setFailure] = useState(null); const submit = async ({ email }: { email: string }) => { setSubmitting(true); setFailure(null); try { const { access_token } = await api.post('/dev/token', { email: email.trim() }); setToken(access_token); onLogin(); } catch (e: unknown) { setFailure(e instanceof Error ? e.message : 'Не удалось выполнить вход'); } finally { setSubmitting(false); } }; const shownError = failure ?? error ?? null; return ( layout='vertical' onFinish={submit} style={{ width: 360 }}>

Вход для разработки

{shownError && } ); } // Production: вход выполняет внешний SSO; если загрузка профиля не удалась, показываем причину и даём повторить запрос function ProdNotice({ onLogin, error }: Props) { return (

Вход выполняется через РАИСА

{error && }
); } export function DevLogin(props: Props) { return (
{/* Литерал process.env.NODE_ENV rsbuild подставляет при сборке: в production форма вырезается из бандла целиком */} {process.env.NODE_ENV !== 'production' ? ( ) : ( // TODO(OQ): параметры JWT РАИСА (издатель, claim с email) )}
); }