Deja que el resultado mueva la aplicación, no sólo la vista
Algunas cargas cambian más que la transcripción:
if (isset($data['site_id'])) {
$state['siteId'] = $data['site_id'];
$state['siteStatus'] = 'provisioning';
$state['progressPercent'] = 30;
$state = $this->updateOrAddProvisioningCard(30, $state);
}
if (isset($data['status'])) {
if ($data['status'] === 'provisioning' && ! isset($data['site_id'])) {
$state['progressPercent'] = min($state['progressPercent'] + 25, 85);
$state = $this->updateOrAddProvisioningCard($state['progressPercent'], $state);
}
if ($data['status'] === 'completed') {
$state['siteStatus'] = 'completed';
$state['progressPercent'] = 100;
$state['siteUrl'] = SiteUrl::normalise($data['display_url'] ?? $data['url'] ?? '');
$state['messages'][] = ['role' => 'status', 'type' => 'completed', 'url' => $state['siteUrl']];
}
}
Fíjate en min($state['progressPercent'] + 25, 85). El progreso aquí no se mide: se infiere. Cada comprobación de estado empuja la barra un poco, y se limita por debajo de 100 para que nunca pueda afirmar que ha terminado antes de que termine de verdad. Imprecisión honesta: la barra se mueve, y sólo la señal real la completa.
Fíjate también en $data['display_url'] ?? $data['url'] ?? '', y luego normalizado. Una carga ensamblada a varios servicios de distancia cambiará de forma tarde o temprano; una cadena de alternativas y un normalizador cuestan una línea y sobreviven a eso.
Y todo el manejador va envuelto:
catch (\Exception $e) {
report($e);
}
Una carga malformada de una herramienta no debe tumbar un turno que ya ha producido buen trabajo. Repórtalo y conserva el estado que tengas.
Lo que sostiene este capítulo
- No dejes que la prosa del modelo sea tu interfaz. Representa el resultado estructurado; la frase es un comentario.
- Ramifica por claves de la carga, no por nombres de herramienta, para que los renombrados no rompan la representación y resultados parecidos compartan renderizador.
- Salta en silencio una carga que no se decodifica. Debería costar una tarjeta, no la respuesta.
- Da a los mensajes de estado su propio rol y un
type, con todo lo que la vista necesita dentro. - Identifica cada tarjeta con un hash del contenido, para que dos tarjetas en una transcripción conserven su estado entre renderizados.
- Distingue eventos de estado. Los eventos se añaden; el estado actualiza la tarjeta existente en su sitio.
- Extrae enlaces, escapa, formatea y reinserta. Escapar primero codifica dos veces las URLs que ya contienen entidades.
- Usa lista blanca de formato en lugar de pasar un analizador de markdown completo sobre texto no confiable.
- Limita el progreso inferido por debajo de completado, y deja que sólo la señal real lo termine.
- Envuelve el manejo de resultados para que una carga malformada no descarte el buen trabajo de un turno.