- Cart context with pure functions for add/remove/update/hydrate - Price formatting via ex_money (replaces all float division) - CartHook on_mount with attach_hook for shared event handlers (open/close drawer, remove item, PubSub sync) - Accessible cart drawer with focus trap, scroll lock, aria-live - Cart page with increment/decrement quantity controls - Preview mode cart drawer support in theme editor - Cart persistence to session via JS hook + API endpoint - 19 tests covering all Cart pure functions Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
32 lines
775 B
Elixir
32 lines
775 B
Elixir
defmodule SimpleshopThemeWeb.CartController do
|
|
@moduledoc """
|
|
API controller for cart session persistence.
|
|
|
|
LiveView cannot write to session directly, so cart updates are persisted
|
|
via this API endpoint called from a JS hook after each cart modification.
|
|
"""
|
|
|
|
use SimpleshopThemeWeb, :controller
|
|
|
|
alias SimpleshopTheme.Cart
|
|
|
|
@doc """
|
|
Updates the cart in session.
|
|
|
|
Expects JSON body with `items` as a list of [variant_id, quantity] arrays.
|
|
"""
|
|
def update(conn, %{"items" => items}) when is_list(items) do
|
|
cart_items = Cart.deserialize(items)
|
|
|
|
conn
|
|
|> Cart.put_in_session(cart_items)
|
|
|> json(%{ok: true})
|
|
end
|
|
|
|
def update(conn, _params) do
|
|
conn
|
|
|> put_status(:bad_request)
|
|
|> json(%{error: "Invalid cart data"})
|
|
end
|
|
end
|