Mejorando la experiencia de onboarding en Brenia mediante máquinas de estado
En el proyecto Breniapp/brenia, nos enfrentamos a un problema común en los flujos de configuración inicial (onboarding): los usuarios quedaban atrapados en un callejón sin salida cuando el proceso de construcción de marca fallaba. Para resolver esto, hemos rediseñado la navegación utilizando una máquina de estado robusta, permitiendo transiciones controladas y una recuperación de errores mucho más amigable.
El desafío del flujo de falla
Originalmente, cuando la lógica de construcción de marca fallaba, el usuario solo tenía una opción: "Intentar de nuevo". Esto no solo era frustrante, sino que ignoraba la causa raíz del problema. Ahora, hemos implementado una pantalla dedicada (failed) que se activa mediante nuestra lógica de control de flujo.
Implementación con estados
Utilizando un enfoque de máquina de estados dentro de nuestros componentes Livewire en Laravel, gestionamos el conteo de fallas y las opciones de navegación dinámicas. Esto asegura que, tras múltiples intentos, el sistema sugiera proactivamente alternativas en lugar de permitir un bucle infinito.
public function transitionToFailureState(): void
{
$this->failureCount++;
if ($this->failureCount >= 2) {
$this->state = 'proactive_alternatives';
} else {
$this->state = 'failed';
}
}
public function editSources(): void
{
// Preservamos el estado de los inputs para evitar fricción
$this->state = 'editing';
}
Resultados clave
- Recuperación del contexto: Al seleccionar "Volver / Editar fuentes", el usuario regresa al formulario con sus datos previos intactos, eliminando la necesidad de reescribir información.
- Alternativas inteligentes: Si una fuente específica falla, ofrecemos caminos alternativos (como construir mediante el sitio web) sin obligar al usuario a recargar la página.
- Prevención de bucles: Tras dos fallas consecutivas, la interfaz ajusta las prioridades de los botones para guiar al usuario fuera del proceso fallido de manera eficiente.
Este cambio no solo mejora la usabilidad, sino que hace que nuestra arquitectura de componentes sea mucho más predecible ante errores inesperados durante la ingesta de datos.