diff --git a/driver-pwa/frontend/src/pages/DevLoginPage.test.tsx b/driver-pwa/frontend/src/pages/DevLoginPage.test.tsx index 8f25e2d..b3e9763 100644 --- a/driver-pwa/frontend/src/pages/DevLoginPage.test.tsx +++ b/driver-pwa/frontend/src/pages/DevLoginPage.test.tsx @@ -59,8 +59,9 @@ describe("DevLoginPage", () => { await userEvent.click(screen.getByRole("button", { name: "Войти" })); expect(useStaff.getState().token).toBeNull(); + // Шестая цифра отправляет код сама: раньше форма ждала нажатия, а «Готово» на + // клавиатуре телефона ничего не делало — выглядело как «код не принят». await userEvent.type(await screen.findByPlaceholderText("000000"), "123456"); - await userEvent.click(screen.getByRole("button", { name: "Подтвердить" })); expect(staffApi.staffLogin2fa).toHaveBeenCalledWith("partial", "123456"); expect(useStaff.getState().token).toBe("staff-tok"); }); diff --git a/driver-pwa/frontend/src/pages/DevLoginPage.tsx b/driver-pwa/frontend/src/pages/DevLoginPage.tsx index 0d06b2f..e5771ef 100644 --- a/driver-pwa/frontend/src/pages/DevLoginPage.tsx +++ b/driver-pwa/frontend/src/pages/DevLoginPage.tsx @@ -42,11 +42,11 @@ export function DevLoginPage() { } } - async function submit2fa() { - if (!partial || code.length < 6 || busy) return; + async function submit2fa(value = code) { + if (!partial || value.length < 6 || busy) return; setBusy(true); try { - const r = await staffLogin2fa(partial, code); + const r = await staffLogin2fa(partial, value); if (!r.access_token) throw new Error("no token"); setStaff(r.access_token, username); setPartial(null); @@ -80,13 +80,23 @@ export function DevLoginPage() { <>

Код из приложения-аутентификатора.

setCode(e.target.value.replace(/\D/g, "").slice(0, 6))} + onChange={(e) => { + const next = e.target.value.replace(/\D/g, "").slice(0, 6); + setCode(next); + // Шесть цифр — код собран, ждать нажатия нечего: у TOTP всё равно + // остаётся секунд тридцать. Раньше отправки не было ни по Enter, ни + // по «Готово» на клавиатуре телефона, и это выглядело как «код не принят». + if (next.length === 6) void submit2fa(next); + }} + onKeyDown={(e) => { if (e.key === "Enter") void submit2fa(); }} placeholder="000000" className="card w-full px-4 py-3 mb-3 text-base tracking-widest bg-white" /> -