# Eventos

> Monitore a abertura, o fechamento e o consentimento registrado no checkout com `on()` e `off()` e entenda a regra de um listener por evento.

O checkout informa à sua página o que está fazendo. Assine com `on()`:

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

## Um listener por nome de evento

`on()` armazena **um** callback por nome de evento. Registrar um segundo callback para o mesmo nome substitui o primeiro – ele não é adicionado a ele:

```js
entase.on('checkout.closed', a);
entase.on('checkout.closed', b);   // a foi removido; apenas b é executado
```

`off()` remove o que estiver registrado para um nome. Ele ignora qualquer callback que você passar, portanto `off('checkout.closed', b)` e `off('checkout.closed')` fazem a mesma coisa.

Se várias partes da sua página precisarem reagir ao mesmo evento, registre um callback e distribua as chamadas dentro dele.

## Assinar vários eventos de uma vez

Ambos os métodos aceitam uma string separada por espaços ou uma matriz de nomes, registrando o mesmo callback para cada um:

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

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

## O payload

Cada callback recebe um objeto:

| Campo | Tipo | Descrição |
|---|---|---|
| `name` | string | O nome do evento, útil quando um callback trata vários eventos. |
| `context` | object | Contém `eventID` – o evento ao qual este checkout pertence. |
| `data` | object | Detalhe específico do evento. |

## Eventos disponíveis

| Nome | Quando é disparado |
|---|---|
| `checkout.ready` | O checkout foi carregado e está pronto para interação. É também quando o cliente repassa o `clientContext` que você passou para `book()`. |
| `checkout.closed` | O checkout foi fechado. O cliente desmonta o painel ou a janela e remove o fundo. |
| `checkout.consent` | O visitante respondeu ao aviso dos termos. `data.consent` é `true` quando ele aceita, e o cliente registra essa escolha para que essa etapa seja ignorada na 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');
});
```

## Os listeners persistem entre reservas individuais

Os listeners pertencem à instância, não a uma reserva. Registre-os uma vez, após criar o cliente, e eles se aplicam a todas as chamadas de `book()`. Use `payload.context.eventID` para diferenciar as reservas:

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

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

Chamar `destroy()` interrompe todos eles – a instância deixa de escutar completamente as mensagens do checkout.

## Mensagens de outras fontes são ignoradas

O cliente aceita apenas mensagens da origem do checkout da Entase, portanto tráfego `postMessage` não relacionado na sua página nunca chegará aos seus callbacks.
