diff --git a/lib/simpleshop_theme/cart.ex b/lib/simpleshop_theme/cart.ex index a288520..2c45649 100644 --- a/lib/simpleshop_theme/cart.ex +++ b/lib/simpleshop_theme/cart.ex @@ -117,11 +117,18 @@ defmodule SimpleshopTheme.Cart do else variants_map = Products.get_variants_with_products(variant_ids) + # Fall back to mock data for variant IDs not found in DB (demo mode) + missing_ids = variant_ids -- Map.keys(variants_map) + mock_map = if missing_ids != [], do: mock_variants_map(missing_ids), else: %{} + cart_items |> Enum.map(fn {variant_id, quantity} -> case Map.get(variants_map, variant_id) do nil -> - nil + case Map.get(mock_map, variant_id) do + nil -> nil + item -> %{item | quantity: quantity} + end variant -> %{ @@ -162,6 +169,37 @@ defmodule SimpleshopTheme.Cart do end end + # Build a lookup map from mock product data for variant IDs not in the DB. + # Allows the cart to work in demo mode when no real products are synced. + defp mock_variants_map(variant_ids) do + ids_set = MapSet.new(variant_ids) + + SimpleshopTheme.Theme.PreviewData.products() + |> Enum.flat_map(fn product -> + (product[:variants] || []) + |> Enum.filter(fn v -> MapSet.member?(ids_set, v.id) end) + |> Enum.map(fn v -> + image = + case product[:image_url] do + "/mockups/" <> _ = url -> "#{url}-400.webp" + url -> url + end + + {v.id, + %{ + variant_id: v.id, + product_id: product.id, + name: product.name, + variant: format_variant_options(v.options), + price: v.price, + quantity: 1, + image: image + }} + end) + end) + |> Map.new() + end + # ============================================================================= # Helpers # =============================================================================