# Eventos

> Monitorize a abertura, o encerramento e o consentimento do checkout com `on()` e `off()` e compreenda a regra de um listener por evento.

O checkout comunica à sua página o que está a fazer. Subscreva 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. Registar um segundo callback para o mesmo nome substitui o primeiro – não o adiciona:

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

`off()` remove tudo o que estiver registado para um nome. Ignora qualquer callback que lhe seja passado, pelo que `off('checkout.closed', b)` e `off('checkout.closed')` fazem o mesmo.

Se várias partes da sua página precisarem de reagir ao mesmo evento, registe um callback e distribua a partir do seu interior.

## Subscrever vários eventos de uma só vez

Ambos os métodos aceitam uma string com nomes separados por espaços ou um array de nomes, registando 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 processa vários. |
| `context` | object | Contém `eventID` – o evento ao qual este checkout pertence. |
| `data` | object | Detalhe específico do evento. |

## Eventos disponíveis

| Nome | Quando é acionado |
|---|---|
| `checkout.ready` | O checkout foi carregado e está pronto para interação. É também nesta altura que o cliente transmite o `clientContext` que passou a `book()`. |
| `checkout.closed` | O checkout foi encerrado. O cliente desmonta o painel ou a janela e limpa o fundo. |
| `checkout.consent` | O visitante respondeu ao aviso sobre os termos. `data.consent` é `true` quando os aceitou, e o cliente guarda essa informação para que o passo seja ignorado da 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 sobrevivem a reservas individuais

Os listeners pertencem à instância, não a uma reserva. Registe-os uma vez, depois de criar o cliente, e aplicam-se a todas as chamadas a `book()`. Utilize `payload.context.eventID` para distinguir as reservas:

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

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

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

## As mensagens de outras origens são ignoradas

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