# Tryby płatności

> Jak klient wybiera między osadzonym panelem a wyskakującym oknem, dlaczego decydują o tym zaufane źródła i czego oczekiwać podczas lokalnego programowania.

Checkout otwiera się w jednym z dwóch trybów.

**Panel** to osadzony panel renderowany na Twojej stronie. Na komputerze stacjonarnym wysuwa się z prawej strony, do maksymalnej szerokości `pane.width`; na urządzeniach mobilnych wysuwa się od dołu. Odwiedzający pozostaje na Twojej stronie, a panel zamyka się po naciśnięciu klawisza Escape lub kliknięciu przyciemnionego obszaru.

**Wyskakujące okno** to osobne okno przeglądarki, wyśrodkowane na ekranie odwiedzającego. Klient monitoruje zamknięcie okna, aby móc usunąć tło.

## Osadzony checkout wymaga zaufanego źródła

Tryb Panel renderuje checkout Entase w elemencie iframe w Twojej domenie, dlatego jest dozwolony tylko w domenach, które zostały przez Ciebie wyraźnie autoryzowane. Dodaj każdą domenę, z której otwierasz checkout, do **Zaufanych źródeł** w Ustawienia → Integracje – zobacz [Integracje i dostosowywanie checkoutu](/organizers/settings/integrations-and-checkout-customization.md).

To, czy prefiks `www.` jest uwzględniony, ma znaczenie. Jeśli nie masz pewności, z której wersji korzysta Twoja witryna, dodaj obie.

Jeśli Twojej domeny nie ma na liście, checkout nadal działa – po prostu otwiera się jako wyskakujące okno.

## Jak rozwiązywana jest wartość `'auto'`

Przy domyślnym ustawieniu `checkoutMode: 'auto'` klient podejmuje decyzję w następującej kolejności:

1. **Brak HTTPS** → wyskakujące okno. Osadzony checkout nigdy nie jest używany na niezabezpieczonej stronie.
2. **`localhost` lub `127.0.0.1`** → panel, z ostrzeżeniem zapisanym w konsoli. To ułatwienie dla programistów, dzięki któremu możesz tworzyć rozwiązanie z użyciem osadzonego układu; nie mówi ono nic o tym, czy Twoja domena produkcyjna jest dozwolona.
3. **W pozostałych przypadkach** → klient pyta Entase, czy to źródło może używać osadzonego checkoutu, wysyłając `pk` w celu identyfikacji konta. Jeśli odpowiedź zawiera pane, tryb zmienia się na panel.

Do czasu otrzymania odpowiedzi trybem jest **popup**. To zachowanie najczęściej zaskakuje: sprawdzenie jest asynchroniczne, więc wywołanie `book()` uruchomione natychmiast po załadowaniu strony – zanim odwiedzający zdąży cokolwiek kliknąć – może nadal otworzyć wyskakujące okno nawet w doskonale skonfigurowanej domenie. W praktyce rzeczywiste kliknięcie zawsze następuje długo po zakończeniu sprawdzenia. Jeśli otwierasz checkout automatycznie, wymuś tryb zamiast polegać na wykrywaniu.

## Wymuszanie trybu

Ustaw jawnie `checkoutMode`, aby całkowicie pominąć wykrywanie:

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

Możesz też zastąpić go dla pojedynczej rezerwacji:

```js
entase.book('EVENT_ID', { checkoutMode: 'popup' });
```

Wymuszenie `'pane'` w domenie, która nie jest zaufanym źródłem, nie nadaje uprawnień – panel się otworzy, ale checkout w nim nie będzie mógł komunikować się z Twoją stroną. Używaj `'popup'` jako świadomego wyboru, a `'auto'` pozostaw włączone, gdy chcesz korzystać z osadzonego checkoutu wszędzie tam, gdzie jest dozwolony.

Nierozpoznana wartość jest ignorowana i traktowana jako `'auto'`.

## Odczytywanie i zmienianie trybu w czasie działania

```js
entase.getCheckoutMode();        // 'pane' or 'popup' — never 'auto'
entase.setCheckoutMode('popup'); // applies to every later book() call
```

`getCheckoutMode()` zwraca *rozwiązany* tryb, więc wskazuje, co faktycznie się wydarzy. Ustawienie trybu z powrotem na `'auto'` ponownie uruchamia wykrywanie.

## Blokowanie wyskakujących okien

Przeglądarki zezwalają na `window.open()` tylko podczas działania użytkownika. Wywołaj `book()` bezpośrednio w procedurze obsługi kliknięcia – nie po `await`, `fetch` ani `setTimeout`, ponieważ w tym momencie działanie użytkownika już wygasło i wyskakujące okno zostanie zablokowane.

```js
// Blocked: the gesture is gone by the time book() runs.
button.addEventListener('click', async () => {
  const event = await fetch('/api/current-event').then(r => r.json());
  entase.book(event.id);
});

// Fine: resolve the id first, open on the click.
button.addEventListener('click', () => entase.book(button.dataset.eventId));
```

Dotyczy to wyłącznie trybu wyskakującego okna. Tryb Panel tworzy element na stronie i nie podlega temu ograniczeniu.
