# Události

> Pomocí `on()` a `off()` naslouchejte otevření a zavření checkoutu i udělení souhlasu a seznamte se s pravidlem jednoho listeneru na událost.

Checkout na vaši stránku hlásí, co právě dělá. Přihlaste se k odběru pomocí `on()`:

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

## Jeden listener na název události

`on()` ukládá **jeden** callback pro každý název události. Registrace druhého callbacku se stejným názvem nahradí první – nepřidá se k němu:

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

`off()` odebere cokoli, co je pro daný název zaregistrováno. Ignoruje callback, který mu předáte, takže `off('checkout.closed', b)` a `off('checkout.closed')` dělají totéž.

Pokud potřebuje na stejnou událost reagovat několik částí stránky, zaregistrujte jeden callback a reakce rozešlete z něj.

## Přihlášení k odběru několika událostí najednou

Obě metody přijímají řetězec názvů oddělených mezerami nebo pole názvů a pro každý z nich zaregistrují stejný callback:

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

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

## Payload

Každý callback obdrží jeden objekt:

| Pole | Typ | Popis |
|---|---|---|
| `name` | string | Název události, užitečný, když jeden callback obsluhuje několik událostí. |
| `context` | object | Obsahuje `eventID` – událost, ke které tento checkout patří. |
| `data` | object | Podrobnosti specifické pro danou událost. |

## Dostupné události

| Název | Kdy se vyvolá |
|---|---|
| `checkout.ready` | Checkout se načetl a je připraven k interakci. V tomto okamžiku klient také předá `clientContext`, který jste předali metodě `book()`. |
| `checkout.closed` | Checkout se zavřel. Klient odstraní panel nebo okno a vymaže pozadí. |
| `checkout.consent` | Návštěvník odpověděl na oznámení o podmínkách. Hodnota `data.consent` je `true`, pokud je přijal, a klient si ji zapamatuje, takže se tento krok příště přeskočí. |

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

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

## Listenery přetrvají jednotlivé rezervace

Listenery patří instanci, nikoli rezervaci. Zaregistrujte je jednou po vytvoření klienta a budou platit pro každé volání `book()`. K rozlišení rezervací použijte `payload.context.eventID`:

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

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

Volání `destroy()` je všechny zastaví – instance přestane úplně naslouchat zprávám z checkoutu.

## Zprávy z jiných zdrojů jsou ignorovány

Klient přijímá zprávy pouze z původu checkoutu Entase, takže nesouvisející provoz `postMessage` na vaší stránce se nikdy nedostane k vašim callbackům.
