# Eventos

> Escucha la apertura, el cierre y el consentimiento de registro del checkout con on() y off(), y comprende la regla de un listener por evento.

El checkout informa a tu página de lo que está haciendo. Suscríbete con `on()`:

```js
entase.on('checkout.ready', payload => {
  console.log('checkout open for', payload.context.eventID);
});
```

## Un listener por nombre de evento

`on()` almacena **un** callback por nombre de evento. Registrar un segundo callback con el mismo nombre sustituye al primero – no se añade a él:

```js
entase.on('checkout.closed', a);
entase.on('checkout.closed', b);   // a is gone; only b runs
```

`off()` elimina cualquier callback registrado para un nombre. Ignora cualquier callback que le pases, por lo que `off('checkout.closed', b)` y `off('checkout.closed')` hacen lo mismo.

Si varias partes de tu página necesitan reaccionar al mismo evento, registra un callback y distribuye las acciones desde su interior.

## Suscribirse a varios eventos a la vez

Ambos métodos aceptan una cadena de texto con nombres separados por espacios o un array de nombres, y registran el mismo callback para cada uno:

```js
entase.on('checkout.ready checkout.closed', payload => {
  console.log(payload.name);
});

entase.off(['checkout.ready', 'checkout.closed']);
```

## La carga útil

Cada callback recibe un objeto:

| Campo | Tipo | Descripción |
|---|---|---|
| `name` | cadena | El nombre del evento, útil cuando un callback gestiona varios. |
| `context` | objeto | Contiene `eventID` – el evento al que pertenece este checkout. |
| `data` | objeto | Información específica del evento. |

## Eventos disponibles

| Nombre | Cuándo se activa |
|---|---|
| `checkout.ready` | El checkout se ha cargado y está listo para interactuar. También es el momento en que el cliente entrega el `clientContext` que pasaste a `book()`. |
| `checkout.closed` | El checkout se ha cerrado. El cliente desmonta el panel o la ventana y elimina el fondo. |
| `checkout.consent` | El visitante ha respondido al aviso de condiciones. `data.consent` es `true` cuando las acepta, y el cliente lo recuerda para omitir este paso la próxima vez. |

```js
entase.on('checkout.closed', () => {
  document.body.classList.remove('checkout-open');
});

entase.on('checkout.consent', payload => {
  if (payload.data.consent) console.log('terms accepted');
});
```

## Los listeners persisten entre reservas individuales

Los listeners pertenecen a la instancia, no a una reserva. Regístralos una vez, después de crear el cliente, y se aplicarán a cada llamada a `book()`. Usa `payload.context.eventID` para distinguir las reservas:

```js
const entase = new Entase({ pk: 'YOUR_PUBLISHABLE_KEY' });

entase.on('checkout.closed', payload => {
  refreshAvailability(payload.context.eventID);
});
```

Al llamar a `destroy()` se detienen todos – la instancia deja por completo de escuchar los mensajes del checkout.

## Se ignoran los mensajes de otros orígenes

El cliente solo acepta mensajes procedentes del origen del checkout de Entase, por lo que el tráfico `postMessage` no relacionado en tu página nunca llegará a tus callbacks.
