# Tapahtumat

> Kuuntele kassan avautumista, sulkeutumista ja suostumuksen tallentamista funktioilla on() ja off(), ja ymmärrä yhden kuuntelijan sääntö tapahtumaa kohden.

Kassa ilmoittaa sivullesi, mitä se tekee. Tilaa ilmoitukset funktiolla `on()`:

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

## Yksi kuuntelija tapahtuman nimeä kohden

`on()` tallentaa **yhden** takaisinsoittokutsun tapahtuman nimeä kohden. Toisen takaisinsoittokutsun rekisteröiminen samalla nimellä korvaa ensimmäisen – se ei lisää sitä ensimmäiseen:

```js
entase.on('checkout.closed', a);
entase.on('checkout.closed', b);   // a poistuu; vain b suoritetaan
```

`off()` poistaa kyseiselle nimelle rekisteröidyn takaisinsoittokutsun. Se ohittaa sille välittämäsi takaisinsoittokutsun, joten `off('checkout.closed', b)` ja `off('checkout.closed')` tekevät saman asian.

Jos sivusi usean osan täytyy reagoida samaan tapahtumaan, rekisteröi yksi takaisinsoittokutsu ja välitä tapahtuma eteenpäin sen sisältä.

## Usean tapahtuman tilaaminen kerralla

Molemmat metodit hyväksyvät välilyönnein erotellun merkkijonon tai nimitaulukon ja rekisteröivät saman takaisinsoittokutsun jokaiselle:

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

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

## Payload

Jokainen takaisinsoittokutsu vastaanottaa yhden objektin:

| Kenttä | Tyyppi | Kuvaus |
|---|---|---|
| `name` | merkkijono | Tapahtuman nimi, hyödyllinen, kun yksi takaisinsoittokutsu käsittelee useita tapahtumia. |
| `context` | objekti | Sisältää `eventID`-arvon – tapahtuman, johon tämä kassa kuuluu. |
| `data` | objekti | Tapahtumakohtaiset tiedot. |

## Käytettävissä olevat tapahtumat

| Nimi | Milloin se käynnistyy |
|---|---|
| `checkout.ready` | Kassa on latautunut ja valmis käytettäväksi. Tällöin asiakasohjelma vastaanottaa myös `clientContext`-arvon, jonka välitit funktiolle `book()`. |
| `checkout.closed` | Kassa on suljettu. Asiakasohjelma purkaa paneelin tai ikkunan ja poistaa taustan. |
| `checkout.consent` | Vierailija vastasi ehtoilmoitukseen. `data.consent` on `true`, kun hän hyväksyi ehdot, ja asiakasohjelma muistaa tämän, joten vaihe ohitetaan seuraavalla kerralla. |

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

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

## Kuuntelijat säilyvät yksittäisten varausten välillä

Kuuntelijat kuuluvat instanssiin, eivät varaukseen. Rekisteröi ne kerran asiakasohjelman luomisen jälkeen, niin ne koskevat jokaista `book()`-kutsua. Erota varaukset toisistaan käyttämällä arvoa `payload.context.eventID`:

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

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

`destroy()`-kutsu pysäyttää ne kaikki – instanssi lakkaa kokonaan kuuntelemasta kassasta tulevia viestejä.

## Muista lähteistä tulevat viestit ohitetaan

Asiakasohjelma hyväksyy viestejä vain Entase-kassan alkuperästä, joten sivusi asiaankuulumaton `postMessage`-liikenne ei koskaan saavuta takaisinsoittokutsujasi.
