# Zdarzenia

> Nasłuchuj otwarcia i zamknięcia okna zakupu oraz udzielenia zgody za pomocą `on()` i `off()` oraz poznaj zasadę jednego nasłuchiwacza na zdarzenie.

Okno zakupu przekazuje Twojej stronie informacje o tym, co robi. Zasubskrybuj zdarzenia za pomocą `on()`:

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

## Jeden nasłuchiwacz na nazwę zdarzenia

`on()` przechowuje **jedno** wywołanie zwrotne dla każdej nazwy zdarzenia. Zarejestrowanie drugiego wywołania zwrotnego dla tej samej nazwy zastępuje pierwsze – nie dodaje go do niego:

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

`off()` usuwa wszystko, co jest zarejestrowane dla danej nazwy. Ignoruje wszelkie przekazane mu wywołanie zwrotne, więc `off('checkout.closed', b)` i `off('checkout.closed')` działają tak samo.

Jeśli kilka części Twojej strony musi reagować na to samo zdarzenie, zarejestruj jedno wywołanie zwrotne i rozdziel obsługę wewnątrz niego.

## Subskrybowanie kilku zdarzeń jednocześnie

Obie metody przyjmują ciąg znaków z nazwami oddzielonymi spacjami lub tablicę nazw, rejestrując to samo wywołanie zwrotne dla każdej z nich:

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

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

## Ładunek

Każde wywołanie zwrotne otrzymuje jeden obiekt:

| Pole | Typ | Opis |
|---|---|---|
| `name` | string | Nazwa zdarzenia, przydatna, gdy jedno wywołanie zwrotne obsługuje kilka zdarzeń. |
| `context` | object | Zawiera `eventID` – wydarzenie, do którego należy to okno zakupu. |
| `data` | object | Szczegóły specyficzne dla zdarzenia. |

## Dostępne zdarzenia

| Nazwa | Kiedy jest wywoływane |
|---|---|
| `checkout.ready` | Okno zakupu zostało załadowane i jest gotowe do interakcji. W tym momencie klient przekazuje również `clientContext`, który przekazano do `book()`. |
| `checkout.closed` | Okno zakupu zostało zamknięte. Klient usuwa panel lub okno oraz czyści tło. |
| `checkout.consent` | Odwiedzający odpowiedział na informację o warunkach. `data.consent` ma wartość `true`, gdy je zaakceptował, a klient zapamiętuje tę odpowiedź, aby następnym razem pominąć ten krok. |

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

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

## Nasłuchiwacze działają po zakończeniu poszczególnych rezerwacji

Nasłuchiwacze należą do instancji, a nie do rezerwacji. Zarejestruj je raz, po utworzeniu klienta, a będą miały zastosowanie do każdego wywołania `book()`. Użyj `payload.context.eventID`, aby rozróżniać rezerwacje:

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

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

Wywołanie `destroy()` zatrzymuje je wszystkie – instancja całkowicie przestaje nasłuchiwać komunikatów z okna zakupu.

## Komunikaty z innych źródeł są ignorowane

Klient akceptuje komunikaty wyłącznie z pochodzenia okna zakupu Entase, więc niepowiązany ruch `postMessage` na Twojej stronie nigdy nie dotrze do Twoich wywołań zwrotnych.
