# Eventi

> Ascolta l'apertura e la chiusura del checkout e il consenso registrato con on() e off(), e comprendi la regola di un solo listener per evento.

Il checkout comunica alla tua pagina ciò che sta facendo. Iscriviti con `on()`:

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

## Un listener per nome evento

`on()` memorizza **una** callback per nome evento. La registrazione di una seconda callback per lo stesso nome sostituisce la prima – non si aggiunge a essa:

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

`off()` rimuove qualsiasi elemento registrato per un nome. Ignora qualsiasi callback le venga passata, quindi `off('checkout.closed', b)` e `off('checkout.closed')` fanno la stessa cosa.

Se più parti della tua pagina devono reagire allo stesso evento, registra una callback e distribuisci le azioni al suo interno.

## Iscriversi a più eventi contemporaneamente

Entrambi i metodi accettano una stringa con nomi separati da spazi o un array di nomi, registrando la stessa callback per ciascuno:

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

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

## Il payload

Ogni callback riceve un oggetto:

| Campo | Tipo | Descrizione |
|---|---|---|
| `name` | string | Il nome dell'evento, utile quando una callback ne gestisce diversi. |
| `context` | object | Contiene `eventID` – l'evento a cui appartiene questo checkout. |
| `data` | object | Dettagli specifici dell'evento. |

## Eventi disponibili

| Nome | Quando viene attivato |
|---|---|
| `checkout.ready` | Il checkout è stato caricato ed è pronto per l'interazione. È anche il momento in cui il client trasferisce il `clientContext` passato a `book()`. |
| `checkout.closed` | Il checkout è stato chiuso. Il client rimuove il pannello o la finestra e cancella lo sfondo. |
| `checkout.consent` | Il visitatore ha risposto all'avviso sui termini. `data.consent` è `true` quando ha accettato e il client lo memorizza, così il passaggio viene saltato la volta successiva. |

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

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

## I listener persistono tra le singole prenotazioni

I listener appartengono all'istanza, non a una prenotazione. Registrali una volta, dopo aver creato il client, e si applicheranno a ogni chiamata `book()`. Usa `payload.context.eventID` per distinguere le prenotazioni:

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

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

La chiamata a `destroy()` li interrompe tutti – l'istanza smette completamente di ascoltare i messaggi dal checkout.

## I messaggi provenienti da altre fonti vengono ignorati

Il client accetta messaggi solo dall'origine del checkout Entase, quindi il traffico `postMessage` non correlato sulla tua pagina non raggiungerà mai le tue callback.
