Configurar email de recuperación
Exportar contenido
Añade o actualiza un correo electrónico alternativo para recuperar el acceso a tu cuenta si pierdes acceso al correo principal.
- Navega a Configuración > Seguridad.
- Localiza la tarjeta “Correo de recuperación”.
- Si no tienes uno configurado:
- Introduce tu correo alternativo en el campo.
- Clic en “Guardar” — email de recuperación configurado.
- Si ya tienes uno configurado:
- Clic en el icono de editar (lápiz).
- Cambia el email o déjalo vacío para eliminarlo.
- Clic en “Guardar” para confirmar.
| Campo | Obligatorio | Descripción | Ejemplo |
|---|---|---|---|
| Email de recuperación | No | Correo alternativo diferente al principal | recovery@ejemplo.com |
Validaciones
Sección titulada «Validaciones»- Debe ser un email válido con formato correcto
- Puede dejarse vacío para eliminar el email de recuperación
- Se recomienda usar un correo diferente al principal
Como se que lo hice bien
Sección titulada «Como se que lo hice bien»- Toast de confirmación: “Correo de recuperación guardado” o “Correo de recuperación eliminado”
- Aparece un badge verde con checkmark y el email configurado
- El email queda guardado en tu perfil
Errores comunes
Sección titulada «Errores comunes»| Mensaje | Causa | Solución |
|---|---|---|
| ”Introduce un correo electrónico válido” | Formato de email incorrecto | Verifica que tenga @ y dominio válido |
| ”No se pudo guardar el correo” | Error de servidor | Reintenta en unos segundos |
Detalles técnicos — Configurar email de recuperación
Sección titulada «Detalles técnicos — Configurar email de recuperación»Implementación técnica
Componente: RecoveryEmailSettings.tsx
Ubicación: /src/features/settings/components/RecoveryEmailSettings.tsx
Schema de validación:
const recoveryEmailSchema = z.object({ recovery_email: z .string() .email("Introduce un correo electrónico válido") .or(z.literal("")),});
type RecoveryEmailFormData = z.infer<typeof recoveryEmailSchema>;Flujo de guardado:
// 1. Validación del formularioconst form = useForm<RecoveryEmailFormData>({ resolver: zodResolver(recoveryEmailSchema),});
// 2. Actualización en base de datosconst { error } = await supabase .from("profiles") .update({ recovery_email: data.recovery_email || null }) .eq("user_id", user.id);
// 3. Invalidación de cachéqueryClient.invalidateQueries({ queryKey: ["profile-recovery-email-settings"] });queryClient.invalidateQueries({ queryKey: ["profile-recovery-email"] });Tabla afectada:
| Tabla | Columna | Tipo | Permite NULL |
|---|---|---|---|
profiles | recovery_email | TEXT | SI |
Índice:
CREATE INDEX IF NOT EXISTS idx_profiles_recovery_emailON public.profiles(recovery_email)WHERE recovery_email IS NOT NULL;Query de diagnóstico:
-- Ver emails de recuperación configuradosSELECT user_id, recovery_email, updated_atFROM profilesWHERE recovery_email IS NOT NULLORDER BY updated_at DESC;
-- Ver perfil específicoSELECT p.user_id, p.recovery_email, u.email as primary_emailFROM profiles pJOIN auth.users u ON p.user_id = u.idWHERE p.user_id = '<user_id>';