Ir al contenido

Configurar email de recuperación

Añade o actualiza un correo electrónico alternativo para recuperar el acceso a tu cuenta si pierdes acceso al correo principal.

  1. Navega a Configuración > Seguridad.
  2. Localiza la tarjeta “Correo de recuperación”.
  3. Si no tienes uno configurado:
    • Introduce tu correo alternativo en el campo.
    • Clic en “Guardar” — email de recuperación configurado.
  4. 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.
CampoObligatorioDescripciónEjemplo
Email de recuperaciónNoCorreo alternativo diferente al principalrecovery@ejemplo.com
  • 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
  • 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
MensajeCausaSolución
”Introduce un correo electrónico válido”Formato de email incorrectoVerifica que tenga @ y dominio válido
”No se pudo guardar el correo”Error de servidorReintenta 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 formulario
const form = useForm<RecoveryEmailFormData>({
resolver: zodResolver(recoveryEmailSchema),
});
// 2. Actualización en base de datos
const { 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:

TablaColumnaTipoPermite NULL
profilesrecovery_emailTEXTSI

Índice:

CREATE INDEX IF NOT EXISTS idx_profiles_recovery_email
ON public.profiles(recovery_email)
WHERE recovery_email IS NOT NULL;

Query de diagnóstico:

-- Ver emails de recuperación configurados
SELECT user_id, recovery_email, updated_at
FROM profiles
WHERE recovery_email IS NOT NULL
ORDER BY updated_at DESC;
-- Ver perfil específico
SELECT p.user_id, p.recovery_email, u.email as primary_email
FROM profiles p
JOIN auth.users u ON p.user_id = u.id
WHERE p.user_id = '<user_id>';