> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aftersell.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Akcje

> Wszystkie akcje Aftersell Cart SDK do odczytu i zmiany koszyka: otwieranie, zamykanie, dodawanie, usuwanie, aktualizacja ilości, zamiana wariantu, odczyt stanu i formatowanie kwot.

Akcje **odczytują i zmieniają koszyk**. Znajdują się pod `window.aftersell.cart.actions`.

<Note>
  Akcje uruchamiaj **po tym, jak koszyk jest gotowy** — wewnątrz `ready()` lub handlera [zdarzenia](/pl/aftersell/cart/sdk-events).
</Note>

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
window.aftersell.cart.ready().then(() => {
  const state = window.aftersell.cart.actions.getCart();
  console.log(state.itemCount, 'items');
});
```

<Note>
  **Zanim koszyk się załaduje, akcje są atrapami (stubs).** Każda z nich loguje w konsoli ostrzeżenie z nazwą akcji, na przykład `cart.actions.addItem() called before the cart loaded`, i nic nie robi. Akcje asynchroniczne nadal zwracają rozwiązany Promise, więc łańcuch `.then()` działa normalnie, zamiast rzucać wyjątek; `getCart()` zwraca `null`, a `formatMoney()` zwraca pusty string.

  Nic się nie psuje, jeśli wywołasz którąś za wcześnie, ale też nic się nie dzieje. Obserwuj konsolę pod kątem tego ostrzeżenia, gdy akcja wydaje się nic nie robić.
</Note>

<div id="every-action">
  ## Wszystkie akcje
</div>

| Akcja                                                    | Sygnatura                            | Zwraca                  | Co robi                                  |
| -------------------------------------------------------- | ------------------------------------ | ----------------------- | ---------------------------------------- |
| [`open`](#open-and-close)                                | `open()`                             | Brak                    | Otwiera drawer.                          |
| [`close`](#open-and-close)                               | `close()`                            | Brak                    | Zamyka drawer.                           |
| [`getCart`](#getcart)                                    | `getCart()`                          | `AftersellCart \| null` | Odczytuje bieżący koszyk.                |
| [`formatMoney`](#formatmoneycents)                       | `formatMoney(cents)`                 | `string`                | Formatuje kwotę do wyświetlenia.         |
| [`addItem`](#additemvariantid-quantity)                  | `addItem(variantId, quantity?)`      | `Promise`               | Dodaje wariant.                          |
| [`removeItem`](#removeitemkey)                           | `removeItem(key)`                    | `Promise`               | Usuwa pozycję.                           |
| [`updateItemQuantity`](#updateitemquantitykey-quantity)  | `updateItemQuantity(key, quantity)`  | `Promise`               | Ustawia ilość pozycji.                   |
| [`replaceLineVariant`](#replacelinevariantkey-variantid) | `replaceLineVariant(key, variantId)` | `Promise`               | Zamienia wariant pozycji.                |
| [`refresh`](#refresh)                                    | `refresh()`                          | `Promise`               | Ponownie pobiera koszyk z Shopify.       |
| [`visualRefresh`](#visualrefresh)                        | `visualRefresh()`                    | Brak                    | Odświeża widok bez ponownego pobierania. |

<Warning>
  Wywołanie akcji z handlera `cart_updated` może spowodować pętlę. Najpierw przeczytaj [dwie zasady](/pl/aftersell/cart/sdk-events#the-two-rules).
</Warning>

***

<div id="drawer">
  ## Drawer
</div>

<div id="open-and-close">
  ### open i close
</div>

Otwierają lub zamykają cart drawer. Obie są synchroniczne i nie przyjmują argumentów.

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// Open the drawer from your own cart link.
document.querySelector('#my-cart-link').addEventListener('click', (event) => {
  event.preventDefault();
  window.aftersell.cart.actions.open();
});
```

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// Close it after the shopper does something in a custom block.
window.aftersell.cart.actions.close();
```

***

<div id="reading">
  ## Odczyt
</div>

<div id="getcart">
  ### getCart()
</div>

Zwraca bieżący [obiekt koszyka](/pl/aftersell/cart/sdk-cart-object) lub `null`, zanim się załaduje. Wynik jest **kopią**, więc jego modyfikacja nie zmieni prawdziwego koszyka.

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
window.aftersell.cart.ready().then(() => {
  const state = window.aftersell.cart.actions.getCart();
  if (!state) return; // the initial load failed

  console.log(state.itemCount, 'items,', state.items.length, 'lines');
  console.log('Total:', window.aftersell.cart.actions.formatMoney(state.totalPrice));
});
```

Ponieważ to migawka, nie przechowuj wyniku; odczytuj go ponownie za każdym razem, gdy potrzebujesz aktualnych danych. W handlerze zdarzenia masz już świeży koszyk jako payload, więc `getCart()` jest tam zbędne.

<div id="formatmoneycents">
  ### formatMoney(cents)
</div>

Formatuje kwotę w jednostkach mniejszych (centach) według formatu walutowego Twojego sklepu. Każda cena w SDK jest w centach, więc w ten sposób zamieniasz ją na coś, co możesz wyświetlić.

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
window.aftersell.cart.actions.formatMoney(5779);  // "$57.79"
window.aftersell.cart.actions.formatMoney(0);     // "$0.00"
```

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// Show the cart total in your own header element.
window.aftersell.cart.events.on('cart_updated', (state) => {
  document.querySelector('#header-total').textContent =
    window.aftersell.cart.actions.formatMoney(state.totalPrice);
});
```

Nadpisz format za pomocą [`configure({ money_format })`](/pl/aftersell/cart/sdk-configure#money_format).

***

<div id="changing-the-cart">
  ## Zmienianie koszyka
</div>

<Note>
  Akcje na pozycjach identyfikują pozycję po jej Shopify **`key`**, a nie po ID wariantu, ponieważ koszyk może zawierać ten sam wariant w kilku pozycjach z różnymi właściwościami. Odczytaj go z `getCart().items[n].key`.
</Note>

<div id="additemvariantid-quantity">
  ### addItem(variantId, quantity?)
</div>

Dodaje wariant do koszyka. `quantity` domyślnie wynosi `1`. Rozwiązuje się, gdy koszyk się ustabilizuje.

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// Add one, then show the shopper.
window.aftersell.cart.actions.addItem(41720671830082).then(() => {
  window.aftersell.cart.actions.open();
});
```

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// Add a specific quantity.
window.aftersell.cart.actions.addItem(41720671830082, 3);
```

Dodanie wariantu, który już jest w koszyku, zwiększa ilość tej pozycji, zamiast tworzyć drugą pozycję — o ile istniejąca pozycja nie ma właściwości pozycji (line item properties). Pozycja z właściwościami to odrębna pozycja, więc powstaje nowa.

<div id="removeitemkey">
  ### removeItem(key)
</div>

Całkowicie usuwa pozycję.

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// Remove any free line from the cart.
const gift = window.aftersell.cart.actions
  .getCart()
  .items.find((line) => line.finalLinePrice === 0);
if (gift) window.aftersell.cart.actions.removeItem(gift.key);
```

<div id="updateitemquantitykey-quantity">
  ### updateItemQuantity(key, quantity)
</div>

Ustawia ilość pozycji. Przekazanie `0` usuwa pozycję.

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
const line = window.aftersell.cart.actions.getCart().items[0];
if (line) window.aftersell.cart.actions.updateItemQuantity(line.key, 3);
```

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// Cap a line at one unit.
window.aftersell.cart.events.on('cart_updated', (state) => {
  state.items.forEach((line) => {
    if (line.variantId === LIMITED_VARIANT_ID && line.quantity > 1) {
      window.aftersell.cart.actions.updateItemQuantity(line.key, 1);
    }
  });
});
```

Ten drugi przykład można bezpiecznie uruchamiać z `cart_updated`, ponieważ warunek `> 1` jest fałszywy przy drugim przebiegu. Zobacz [dwie zasady](/pl/aftersell/cart/sdk-events#the-two-rules).

<div id="replacelinevariantkey-variantid">
  ### replaceLineVariant(key, variantId)
</div>

Zamienia wariant pozycji, zachowując jej ilość i właściwości. Przydatne dla przełącznika rozmiaru lub smaku wewnątrz koszyka.

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
const line = window.aftersell.cart.actions.getCart().items[0];
window.aftersell.cart.actions.replaceLineVariant(line.key, 41720671862850);
```

<Warning>
  Przy zamianie **plan sprzedaży pozycji jest resetowany**. Pozycja subskrypcyjna staje się zakupem jednorazowym, chyba że ponownie zastosujesz plan.
</Warning>

Zamiana to dodanie, po którym następuje usunięcie, a nie edycja w miejscu, więc wynikiem jest **nowa pozycja**: dostaje nowy `key` i ląduje na końcu koszyka. Odczytaj ponownie `getCart()` po zamianie, zamiast ponownie używać przekazanego klucza.

***

<div id="refreshing">
  ## Odświeżanie
</div>

<div id="refresh">
  ### refresh()
</div>

Ponownie pobiera koszyk z Shopify. Użyj tego, gdy coś spoza SDK zmieniło koszyk, a drawer tego nie zauważył.

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// After a raw Ajax API call of your own.
fetch('/cart/add.js', { method: 'POST', /* … */ })
  .then(() => window.aftersell.cart.actions.refresh())
  .then(() => { window.aftersell.cart.actions.open(); });
```

Przez większość czasu tego nie potrzebujesz, ponieważ Aftersell już nasłuchuje standardowych zdarzeń koszyka Shopify i sam pobiera dane. Sięgnij po to, gdy niestandardowa integracja je omija.

<div id="visualrefresh">
  ### visualRefresh()
</div>

Ponownie uruchamia transformacje renderowania bez ponownego pobierania koszyka z Shopify. Rzadko go potrzebujesz: zarejestrowanie (lub wyrejestrowanie) [transformacji pozycji](/pl/aftersell/cart/sdk-hooks#registerlinetransform), [komparatora](/pl/aftersell/cart/sdk-hooks#registerlinecomparator), [wzbogacacza](/pl/aftersell/cart/sdk-hooks#registercartenricher) lub któregokolwiek z [hooków subskrypcji](/pl/aftersell/cart/sdk-hooks#registersubscriptionoptionstransform) wywołuje go za Ciebie. Tylko dwa hooki add-to-cart tego nie robią, ponieważ nie zmieniają niczego, co jest już na ekranie.

Sięgnij po niego, gdy zmienia się coś, od czego transformacja *zależy*, ale sam koszyk nie:

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// A currency switcher changed the format: repaint prices already on screen.
window.myTheme.onCurrencyChange((currency) => {
  window.aftersell.cart.configure({ money_format: FORMATS[currency] });
  window.aftersell.cart.actions.visualRefresh();
});
```

***

<div id="notes-and-edge-cases">
  ## Uwagi i przypadki brzegowe
</div>

* **Akcje asynchroniczne rozwiązują się, gdy zmiana się ustabilizuje.** Oczekiwanie na jedną z nich pozwala sekwencjonować pracę po faktycznej aktualizacji koszyka.
* **`getCart()` zwraca kopię.** Jej modyfikacja nie robi nic z prawdziwym koszykiem.
* **Nie ma akcji dla kodów rabatowych.** Zastosowane kody można odczytać na koszyku (`discountCodes`, `totalDiscount`) i per pozycję (`discountAllocations`); klienci stosują je przez blok [Discount code](/pl/aftersell/cart/discount-code-block).
* **Nie ma akcji dla atrybutów koszyka ani notatek.** Atrybuty można odczytać na obiekcie koszyka; klienci zapisują notatki przez blok [Notes](/pl/aftersell/cart/notes-block).
* **Aby ukryć pozycję zamiast ją usuwać**, użyj [`registerLineTransform`](/pl/aftersell/cart/sdk-hooks#registerlinetransform). Usunięcie zmienia sumę klienta; ukrycie nie.

<div id="where-to-go-next">
  ## Co dalej
</div>

* **[Obiekt koszyka](/pl/aftersell/cart/sdk-cart-object)**: co zwraca `getCart()`.
* **[Zdarzenia](/pl/aftersell/cart/sdk-events)**: kiedy uruchamiać te akcje.
* **[Hooki](/pl/aftersell/cart/sdk-hooks)**: zmieniaj sposób renderowania pozycji zamiast zmieniać koszyk.
* **[Przypadki użycia](/pl/aftersell/cart/sdk-use-cases)**: kompletne rozwiązania typowych potrzeb.
