.
This commit is contained in:
@@ -70,7 +70,7 @@ export function Login({ onLogin }: { onLogin: (user: UserType) => void }) {
|
|||||||
setToken(res.token);
|
setToken(res.token);
|
||||||
onLogin(res.user);
|
onLogin(res.user);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setError(err instanceof Error ? err.message : "Invalid code");
|
setError(err instanceof Error ? err.message : t("login.totpInvalid"));
|
||||||
} finally {
|
} finally {
|
||||||
setBusy(false);
|
setBusy(false);
|
||||||
}
|
}
|
||||||
@@ -100,7 +100,7 @@ export function Login({ onLogin }: { onLogin: (user: UserType) => void }) {
|
|||||||
onChange={(e) => setCode(e.target.value.replace(/\D/g, "").slice(0, 6))}
|
onChange={(e) => setCode(e.target.value.replace(/\D/g, "").slice(0, 6))}
|
||||||
autoComplete="one-time-code"
|
autoComplete="one-time-code"
|
||||||
placeholder="000000"
|
placeholder="000000"
|
||||||
aria-label="Authenticator code"
|
aria-label={t("login.totpAria")}
|
||||||
inputMode="numeric"
|
inputMode="numeric"
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
@@ -111,14 +111,14 @@ export function Login({ onLogin }: { onLogin: (user: UserType) => void }) {
|
|||||||
</p>
|
</p>
|
||||||
)}
|
)}
|
||||||
<Button type="submit" variant="gradient" size="lg" className="w-full" disabled={busy || code.length !== 6}>
|
<Button type="submit" variant="gradient" size="lg" className="w-full" disabled={busy || code.length !== 6}>
|
||||||
{busy ? <Spinner /> : (<>Verify <ArrowRight size={17} /></>)}
|
{busy ? <Spinner /> : (<>{t("login.verify")} <ArrowRight size={17} /></>)}
|
||||||
</Button>
|
</Button>
|
||||||
<button
|
<button
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => { setTotpToken(null); setCode(""); setError(""); }}
|
onClick={() => { setTotpToken(null); setCode(""); setError(""); }}
|
||||||
className="w-full text-center text-sm opacity-60 transition hover:opacity-100 hover:underline"
|
className="w-full text-center text-sm opacity-60 transition hover:opacity-100 hover:underline"
|
||||||
>
|
>
|
||||||
Back to login
|
{t("common.backToLogin")}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
) : (
|
) : (
|
||||||
|
|||||||
@@ -891,7 +891,4 @@ function SecuritySection({ onKeyRotated }: { onKeyRotated?: () => void }) {
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1532,8 +1532,12 @@ const pt: Dict = {
|
|||||||
"login.forgot": "Esqueceste a chave?",
|
"login.forgot": "Esqueceste a chave?",
|
||||||
"login.perk1": "Privado por design — sem cookies nem rastreio",
|
"login.perk1": "Privado por design — sem cookies nem rastreio",
|
||||||
"login.perk2": "Os teus modelos, em tempo real",
|
"login.perk2": "Os teus modelos, em tempo real",
|
||||||
"login.adminNote":
|
"login.adminNotePre": "A chave admin vive no .env do servidor",
|
||||||
"A chave admin vive no .env do servidor; as chaves são emitidas pelo admin.",
|
"login.adminNotePost": "; as chaves são emitidas pelo admin.",
|
||||||
|
"login.totpIntro": "Dois fatores para @{user} — escreve o código de 6 dígitos da app.",
|
||||||
|
"login.totpAria": "Código do autenticador",
|
||||||
|
"login.totpInvalid": "Código inválido",
|
||||||
|
"login.verify": "Verificar",
|
||||||
|
|
||||||
"sidebar.newChat": "Novo chat",
|
"sidebar.newChat": "Novo chat",
|
||||||
"sidebar.collapse": "Ocultar barra lateral",
|
"sidebar.collapse": "Ocultar barra lateral",
|
||||||
|
|||||||
Reference in New Issue
Block a user