# Evenimente

> Urmăriți deschiderea, închiderea și consimțământul pentru checkout cu `on()` și `off()` și înțelegeți regula unui singur listener per eveniment.

Checkout-ul raportează paginii dvs. ce face. Abonați-vă cu `on()`:

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

## Un listener per nume de eveniment

`on()` stochează **un** callback pentru fiecare nume de eveniment. Înregistrarea unui al doilea callback pentru același nume îl înlocuiește pe primul – nu se adaugă la acesta:

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

`off()` elimină orice este înregistrat pentru un nume. Ignoră orice callback îi transmiteți, astfel că `off('checkout.closed', b)` și `off('checkout.closed')` au același efect.

Dacă mai multe părți ale paginii dvs. trebuie să reacționeze la același eveniment, înregistrați un singur callback și distribuiți acțiunile din interiorul acestuia.

## Abonarea la mai multe evenimente simultan

Ambele metode acceptă un șir de caractere cu nume separate prin spații sau un array de nume, înregistrând același callback pentru fiecare:

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

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

## Payload-ul

Fiecare callback primește un obiect:

| Câmp | Tip | Descriere |
|---|---|---|
| `name` | string | Numele evenimentului, util când un callback gestionează mai multe evenimente. |
| `context` | object | Conține `eventID` – evenimentul căruia îi aparține acest checkout. |
| `data` | object | Detalii specifice evenimentului. |

## Evenimente disponibile

| Nume | Când se declanșează |
|---|---|
| `checkout.ready` | Checkout-ul s-a încărcat și este pregătit pentru interacțiune. Tot atunci clientul transmite `clientContext` pe care l-ați furnizat pentru `book()`. |
| `checkout.closed` | Checkout-ul s-a închis. Clientul demontează panoul sau fereastra și elimină fundalul. |
| `checkout.consent` | Vizitatorul a răspuns la notificarea privind termenii. `data.consent` este `true` când a acceptat, iar clientul reține această opțiune, astfel încât pasul este omis data viitoare. |

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

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

## Listenerii persistă între rezervări individuale

Listenerii aparțin instanței, nu unei rezervări. Înregistrați-i o singură dată, după crearea clientului, iar aceștia se aplică fiecărui apel `book()`. Folosiți `payload.context.eventID` pentru a diferenția rezervările:

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

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

Apelarea `destroy()` îi oprește pe toți – instanța nu mai ascultă deloc mesajele de la checkout.

## Mesajele din alte surse sunt ignorate

Clientul acceptă doar mesaje de la originea checkout-ului Entase, astfel încât traficul `postMessage` fără legătură de pe pagina dvs. nu va ajunge niciodată la callback-urile dvs.
