# Συμβάντα

> Παρακολουθήστε το άνοιγμα, το κλείσιμο του checkout και τη συναίνεση καταγραφής με τα on() και off(), και κατανοήστε τον κανόνα ενός ακροατή ανά συμβάν.

Το checkout αναφέρει στη σελίδα σας τι κάνει. Εγγραφείτε με το `on()`:

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

## Ένας ακροατής ανά όνομα συμβάντος

Το `on()` αποθηκεύει **ένα** callback ανά όνομα συμβάντος. Η καταχώριση δεύτερου callback για το ίδιο όνομα αντικαθιστά το πρώτο – δεν προστίθεται σε αυτό:

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

Το `off()` καταργεί ό,τι έχει καταχωριστεί για ένα όνομα. Αγνοεί οποιοδήποτε callback τού περάσετε, επομένως τα `off('checkout.closed', b)` και `off('checkout.closed')` κάνουν το ίδιο.

Αν πολλά μέρη της σελίδας σας πρέπει να αντιδρούν στο ίδιο συμβάν, καταχωρίστε ένα callback και διανείμετε την ενέργεια από μέσα του.

## Εγγραφή σε πολλά συμβάντα ταυτόχρονα

Και οι δύο μέθοδοι δέχονται μια συμβολοσειρά με ονόματα χωρισμένα με κενά ή έναν πίνακα ονομάτων, καταχωρίζοντας το ίδιο callback για κάθε όνομα:

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

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

## Το payload

Κάθε callback λαμβάνει ένα αντικείμενο:

| Πεδίο | Τύπος | Περιγραφή |
|---|---|---|
| `name` | string | Το όνομα του συμβάντος, χρήσιμο όταν ένα callback χειρίζεται περισσότερα από ένα. |
| `context` | object | Περιέχει το `eventID` – το συμβάν στο οποίο ανήκει αυτό το checkout. |
| `data` | object | Λεπτομέρειες ειδικές για το συμβάν. |

## Διαθέσιμα συμβάντα

| Όνομα | Πότε ενεργοποιείται |
|---|---|
| `checkout.ready` | Το checkout έχει φορτωθεί και είναι έτοιμο για αλληλεπίδραση. Τότε είναι επίσης που ο client παραδίδει το `clientContext` που περάσατε στο `book()`. |
| `checkout.closed` | Το checkout έχει κλείσει. Ο client καταργεί το πλαίσιο ή το παράθυρο και εκκαθαρίζει το φόντο. |
| `checkout.consent` | Ο επισκέπτης απάντησε στην ειδοποίηση όρων. Το `data.consent` είναι `true` όταν αποδέχτηκε και ο client το θυμάται, ώστε το βήμα να παραλείπεται την επόμενη φορά. |

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

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

## Οι ακροατές διατηρούνται μεταξύ μεμονωμένων κρατήσεων

Οι ακροατές ανήκουν στο instance, όχι σε μια κράτηση. Καταχωρίστε τους μία φορά, μετά τη δημιουργία του client, και εφαρμόζονται σε κάθε κλήση του `book()`. Χρησιμοποιήστε το `payload.context.eventID` για να ξεχωρίζετε τις κρατήσεις:

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

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

Η κλήση του `destroy()` σταματά όλους τους ακροατές – το instance σταματά εντελώς να ακούει μηνύματα από το checkout.

## Τα μηνύματα από άλλες πηγές αγνοούνται

Ο client δέχεται μόνο μηνύματα από την προέλευση του Entase checkout, επομένως άσχετη κίνηση `postMessage` στη σελίδα σας δεν θα φτάσει ποτέ στα callback σας.
