Co-authored-by: domfelipe <53182096+domfelipe@users.noreply.github.com>
This commit is contained in:
gpt-engineer-app[bot] 2026-04-17 17:02:12 +00:00
parent 0eb8689a27
commit fa8bee0e36
7 changed files with 271 additions and 0 deletions

26
src/lib/auth-errors.ts Normal file
View file

@ -0,0 +1,26 @@
/**
* Traduz mensagens de erro do Supabase Auth para mensagens em português específicas.
*/
export function translateAuthError(message: string | undefined): string {
if (!message) return "Algo deu errado. Tente novamente.";
const m = message.toLowerCase();
if (m.includes("invalid login credentials") || m.includes("invalid_credentials"))
return "E-mail ou senha incorretos. Tente novamente.";
if (m.includes("user already registered") || m.includes("already been registered") || m.includes("already exists"))
return "Esse e-mail já possui cadastro. Deseja fazer login?";
if (m.includes("password") && (m.includes("short") || m.includes("weak") || m.includes("characters")))
return "A senha precisa de pelo menos 8 caracteres, 1 maiúscula e 1 número.";
if (m.includes("email") && m.includes("invalid"))
return "Formato de e-mail inválido.";
if (m.includes("rate limit") || m.includes("too many requests"))
return "Muitas tentativas. Aguarde 1 minuto e tente novamente.";
if (m.includes("expired") || m.includes("jwt") || m.includes("session"))
return "Sua sessão expirou. Faça login novamente.";
if (m.includes("email not confirmed"))
return "Confirme seu e-mail antes de entrar. Verifique sua caixa de entrada.";
if (m.includes("pwned") || m.includes("compromised") || m.includes("breach"))
return "Esta senha apareceu em vazamentos públicos. Escolha outra mais forte.";
return message;
}

14
src/lib/password.ts Normal file
View file

@ -0,0 +1,14 @@
export type PasswordStrength = 0 | 1 | 2 | 3;
export function passwordStrength(password: string): PasswordStrength {
let score = 0;
if (password.length >= 8) score++;
if (/[A-Z]/.test(password) && /[a-z]/.test(password)) score++;
if (/\d/.test(password) && /[^A-Za-z0-9]/.test(password)) score++;
if (password.length >= 12) score = Math.min(3, score + 1) as PasswordStrength;
return Math.min(3, score) as PasswordStrength;
}
export function passwordStrengthLabel(s: PasswordStrength): string {
return ["Muito fraca", "Fraca", "Média", "Forte"][s];
}