DEV Community

Silviu Technology
Silviu Technology

Posted on

React: menos espera al validar emails

Cuando una persona confirma su email, la espera no debería sentirse como un agujero negro. Sin embargo, muchas interfaces solo muestran un spinner y dejan al usuario adivinar si el clic funcionó, si la dirección de correo desechable fue aceptada o si debe pulsar otra vez.

En mis flujos frontend prefiero tratar la validación como una pequeña secuencia de estados. Es una decisión visual, pero también de rendimiento y accesibilidad. Un mensaje corto en el momento correcto puede evitar varios clics repetidos y llamadas duplicadas.

El problema de esperar sin contexto

Un botón que cambia a “Cargando…” ya es mejor que nada, aunque todavía responde pocas preguntas. ¿Se envió el correo? ¿Cuánto puede tardar? ¿Qué ocurre si llega a una bandeja temporal? ¿Dónde se pide otro envío?

La confusión aumenta cuando el layout salta al aparecer el mensaje. El usuario pierde el foco y a veces vuelve a activar la acción. En pruebas he visto que el problema no estaba en React, sino en una combinación de estados ambiguos, altura variable y una API que no diferenciaba “enviado” de “confirmado”.

También conviene separar la experiencia de email del backend. Una arquitectura simple para emails ayuda a pensar en eventos y resultados, no solo en el botón del formulario.

Diseñar estados que expliquen la espera

Para una verificación básica uso cinco estados explícitos:

  • idle: la persona todavía no ha iniciado la acción.
  • sending: la petición está en curso y el botón queda bloqueado.
  • sent: el mensaje fue aceptado para entrega; no significa que ya llegó.
  • confirmed: la aplicación recibió la confirmación.
  • error: se puede reintentar, con una explicación útil.

La diferencia entre sent y confirmed es pequeña en código, pero enorme en confianza. “Email enviado” no promete que la bandeja ya lo contiene. Si usas un servicio de correo temporal para pruebas, tampoco conviene presentar una espera indefinida como si fuera normal.

Un componente React pequeño

El componente no necesita una librería de estado para empezar:

function EmailStatus({ state, onResend }) {
  if (state === "sending") {
    return <p role="status" aria-live="polite">Enviando el email…</p>;
  }

  if (state === "sent") {
    return (
      <div role="status" aria-live="polite">
        <p>Revisa tu bandeja. Puede tardar un momento.</p>
        <button type="button" onClick={onResend}>Reenviar email</button>
      </div>
    );
  }

  if (state === "error") {
    return <p role="alert">No pudimos enviarlo. Inténtalo de nuevo.</p>;
  }

  return null;
}
Enter fullscreen mode Exit fullscreen mode

role="status" anuncia cambios sin interrumpir demasiado la lectura. Para un error que necesita atención inmediata, role="alert" es más apropiado. El botón de reenvío debe tener un límite de frecuencia; si no, una conexión lenta puede crear varios mensajes casi iguales.

Si el envío requiere reintentos en la API, vale la pena coordinar el contrato visual con el servidor. Hay ideas útiles en este artículo sobre reenvíos seguros en signup, especialmente para no convertir cada clic en un envío nuevo.

Accesibilidad y rendimiento

Reserva espacio para el mensaje antes de que aparezca. Un bloque con min-height reduce el movimiento del formulario y evita que el foco termine en un lugar inesperado:

.email-status {
  min-height: 3.5rem;
  margin-block-start: 0.75rem;
}

.email-status button:focus-visible {
  outline: 3px solid currentColor;
  outline-offset: 3px;
}
Enter fullscreen mode Exit fullscreen mode

No uses solo color para distinguir éxito y error. El texto debe decir qué pasó. En móvil, un botón de reenvío necesita una zona cómoda para tocar, y el contador de espera debe seguir siendo legible con zoom.

Un detalle que se olvida mucho: si la petición termina rápido, no fuerces una animación larga. La percepción de rendimiento empeora cuando una respuesta lista se mantiene artificialmente bloqueada. En cambio, durante una demora real, un mensaje progresivo es más honesto que un spinner infinito.

Checklist antes de publicar

Antes de cerrar el flujo reviso:

  1. ¿El botón se desactiva mientras se envía?
  2. ¿Cada estado tiene texto, no solo iconos?
  3. ¿El lector de pantalla recibe el cambio?
  4. ¿El layout conserva su altura?
  5. ¿El reenvío tiene límite y feedback?
  6. ¿Los errores distinguen red, dirección inválida y límite?

Incluso términos imperfectos como “tem email” o “tamp mail com” pueden aparecer en notas de QA, pero no deberían terminar como mensajes visibles para usuarios. La UI puede ser amable y precisa sin explicar toda la infraestructura.

La validación de email no tiene que ser una pantalla sofisticada. Con estados explícitos, CSS estable y una señal accesible, la espera deja de parecer un fallo. Ese pequeño cuidado mejora la confianza más que otro spinner bonito.

Top comments (0)