import { useEffect, useState, type FormEvent } from "react"; import { useNavigate } from "react-router-dom"; import { ApiError, api } from "../api/client"; import type { AuthResult, DemoPersona } from "../api/types"; import { AppShell, Notice, TopBar } from "../components/AppShell"; import { Icon } from "../components/Icon"; import { ru } from "../content/ru"; import { useSession } from "../session/SessionContext"; // A2 · Вход через ЕМИАС (демо: одноразовый код от врача или синтетический пациент) export function EmiasSignIn() { const t = ru.emias; const navigate = useNavigate(); const { signIn } = useSession(); const [code, setCode] = useState(""); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const [personas, setPersonas] = useState(null); useEffect(() => { api .demoPersonas() .then(setPersonas) .catch(() => setPersonas([])); }, []); const finish = (auth: AuthResult) => { signIn(auth); navigate("/flow", { replace: true }); }; const fail = (e: unknown) => { setError(e instanceof ApiError && e.status === 401 ? t.codeError : ru.common.networkError); setBusy(false); }; const submit = async (e: FormEvent) => { e.preventDefault(); if (!code.trim() || busy) return; setBusy(true); setError(null); try { finish(await api.signInEmias(code.trim())); } catch (err) { fail(err); } }; const demo = async (persona: DemoPersona) => { setBusy(true); setError(null); try { finish(await api.signInEmiasDemo(persona.token)); } catch (err) { fail(err); } }; return (
navigate("/")} />

{t.title}

{t.lead}

{t.demoNotice}
setCode(e.target.value)} placeholder={t.codePlaceholder} autoComplete="one-time-code" autoCapitalize="characters" spellCheck={false} maxLength={32} aria-invalid={error ? true : undefined} aria-describedby={error ? "code-error" : undefined} /> {error && ( )}
{t.or}

{t.demoTitle}

{t.demoLead}

{personas?.map((p) => ( ))}
); }