# Hændelser

> Lyt efter, at checkout åbner, lukker og registrerer samtykke med on() og off(), og forstå reglen om én listener pr. hændelse.

Checkout rapporterer tilbage til din side, hvad den foretager sig. Abonnér med `on()`:

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

## Én listener pr. hændelsesnavn

`on()` gemmer **ét** callback pr. hændelsesnavn. Registrering af et andet callback med samme navn erstatter det første – det føjes ikke til:

```js
entase.on('checkout.closed', a);
entase.on('checkout.closed', b);   // a er væk; kun b kører
```

`off()` fjerner det, der er registreret for et navn. Den ignorerer ethvert callback, du sender med, så `off('checkout.closed', b)` og `off('checkout.closed')` gør det samme.

Hvis flere dele af din side skal reagere på den samme hændelse, skal du registrere ét callback og fordele det derfra.

## Abonnér på flere hændelser på én gang

Begge metoder accepterer en streng med navne adskilt af mellemrum eller et array med navne og registrerer det samme callback for hver:

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

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

## Payloadet

Hvert callback modtager ét objekt:

| Felt | Type | Beskrivelse |
|---|---|---|
| `name` | string | Hændelsesnavnet, nyttigt når ét callback håndterer flere. |
| `context` | object | Indeholder `eventID` – den hændelse, som denne checkout hører til. |
| `data` | object | Hændelsesspecifikke oplysninger. |

## Tilgængelige hændelser

| Navn | Hvornår den udløses |
|---|---|
| `checkout.ready` | Checkout er indlæst og klar til interaktion. Det er også her, klienten overdrager den `clientContext`, du sendte til `book()`. |
| `checkout.closed` | Checkout er lukket. Klienten lukker panelet eller vinduet ned og rydder baggrunden. |
| `checkout.consent` | Den besøgende har besvaret vilkårsmeddelelsen. `data.consent` er `true`, når vedkommende har accepteret, og klienten husker det, så trinnet springes over næste gang. |

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

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

## Listenere overlever individuelle bookinger

Listenere tilhører instansen, ikke en booking. Registrer dem én gang, efter klienten er oprettet, og de gælder for hvert `book()`-kald. Brug `payload.context.eventID` til at skelne mellem bookinger:

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

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

Et kald til `destroy()` stopper dem alle – instansen holder helt op med at lytte efter beskeder fra checkout.

## Beskeder fra andre kilder ignoreres

Klienten accepterer kun beskeder fra Entase-checkouts oprindelse, så uvedkommende `postMessage`-trafik på din side når aldrig frem til dine callbacks.
