# Händelser

> Lyssna efter att kassan öppnas och stängs samt efter att samtycke registreras med on() och off(), och förstå regeln om en lyssnare per händelse.

Kassan rapporterar tillbaka till din sida vad den gör. Prenumerera med `on()`:

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

## En lyssnare per händelsenamn

`on()` lagrar **en** callback per händelsenamn. Att registrera en andra callback för samma namn ersätter den första – den läggs inte till:

```js
entase.on('checkout.closed', a);
entase.on('checkout.closed', b);   // a är borta; endast b körs
```

`off()` tar bort det som är registrerat för ett namn. Den ignorerar alla callbackar du skickar med, så `off('checkout.closed', b)` och `off('checkout.closed')` gör samma sak.

Om flera delar av din sida behöver reagera på samma händelse registrerar du en callback och fördelar vidare inifrån den.

## Prenumerera på flera händelser samtidigt

Båda metoderna accepterar en blankstegsavgränsad sträng eller en array med namn och registrerar samma callback för varje namn:

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

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

## Payloaden

Varje callback tar emot ett objekt:

| Fält | Typ | Beskrivning |
|---|---|---|
| `name` | string | Händelsenamnet, användbart när en callback hanterar flera. |
| `context` | object | Innehåller `eventID` – evenemanget som den här kassan hör till. |
| `data` | object | Händelsespecifika detaljer. |

## Tillgängliga händelser

| Namn | När den utlöses |
|---|---|
| `checkout.ready` | Kassan har lästs in och är klar att interagera med. Det är också då klienten lämnar över den `clientContext` som du skickade till `book()`. |
| `checkout.closed` | Kassan har stängts. Klienten monterar ned panelen eller fönstret och tar bort bakgrundsskiktet. |
| `checkout.consent` | Besökaren har svarat på meddelandet om villkoren. `data.consent` är `true` när de godkände, och klienten kommer ihåg det så att steget hoppas över nästa gång. |

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

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

## Lyssnare överlever enskilda bokningar

Lyssnare tillhör instansen, inte en bokning. Registrera dem en gång efter att du har skapat klienten, så gäller de för varje `book()`-anrop. Använd `payload.context.eventID` för att skilja bokningar åt:

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

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

Att anropa `destroy()` stoppar dem alla – instansen slutar helt att lyssna efter meddelanden från kassan.

## Meddelanden från andra källor ignoreras

Klienten tar endast emot meddelanden från Entase-kassans ursprung, så orelaterad `postMessage`-trafik på din sida når aldrig dina callbackar.
