Mejores Prácticas

Manejo de Errores

Patrones para manejar timeouts del bridge, errores tipados de la API, estados de error en la UI, fallos de facturación y errores en el procesamiento de webhooks.

El manejo robusto de errores evita que un solo fallo arruine toda la experiencia del comerciante.

1. Maneja los timeouts del bridge con elegancia

Todas las acciones del bridge tienen un timeout de 5 segundos. Un timeout no significa necesariamente que la acción falló — significa que la respuesta no se recibió a tiempo.

const result = await bridge.toast.show("Saved!");
if (!result.success) {
  // Log for debugging but do not crash the UI
  console.warn("Toast action timed out:", result.error);
}

2. Maneja los errores de la API por tipo

El SDK exporta clases de error tipadas para que puedas responder apropiadamente a cada modo de fallo:

import { NotFoundError, RateLimitError, ValidationError } from "@whatalo/plugin-sdk";

try {
  await client.products.update(id, data);
} catch (error) {
  if (error instanceof NotFoundError) {
    showMessage("Product not found");
  } else if (error instanceof RateLimitError) {
    showMessage(`Too many requests. Try again in ${error.retryAfter}s`);
  } else if (error instanceof ValidationError) {
    showFieldErrors(error.fieldErrors);
  } else {
    // Unexpected error — surface a generic message
    showMessage("An unexpected error occurred");
  }
}

3. Muestra estados de error amigables para el usuario

Usa el componente Banner para mostrar errores en línea en vez de romper la página:

import { Banner } from "./components/whatalo-ui";

{error && (
  <Banner status="error" title="Error">
    {error.message}
  </Banner>
)}

4. Siempre verifica isReady antes de renderizar

El handshake del bridge es asíncrono. Renderizar tu UI principal antes de que isReady sea true significa que el contexto del bridge aún no está disponible.

import { Spinner } from "./components/whatalo-ui";
import { useAppBridge } from "@whatalo/plugin-sdk/bridge";

function App() {
  const { isReady } = useAppBridge();

  // Show spinner until the bridge is initialized
  if (!isReady) return <Spinner />;

  return <DashboardPage />;
}

5. Maneja los errores de facturación

Los métodos de facturación lanzan errores al fallar. Envuélvelos en try/catch e informa al comerciante:

try {
  await bridge.billing.requestSubscription("pro");
} catch (error) {
  bridge.toast.show("Could not start subscription. Please try again.", {
    variant: "error",
  });
}

6. Registra errores en los handlers de webhook

Siempre registra los fallos en tus handlers de webhook para poder diagnosticar problemas de entrega:

export async function POST(request: Request) {
  try {
    const payload = await request.json();
    await processOrder(payload);
    return new Response("OK", { status: 200 });
  } catch (error) {
    console.error("[webhook] order.created failed:", error);
    return new Response("Processing failed", { status: 500 });
  }
}

Usa whatalo logs para revisar el historial de entrega de webhooks y reintentar eventos fallidos:

# Follow failed webhook deliveries in real time
whatalo logs --status failed --follow

On this page