Skip to content

fix(storefront): Show kit contents and pick variations on product page - #799

Open
vitorrgg wants to merge 2 commits into
mainfrom
fix/product-details-kit-composition
Open

fix(storefront): Show kit contents and pick variations on product page#799
vitorrgg wants to merge 2 commits into
mainfrom
fix/product-details-kit-composition

Conversation

@vitorrgg

@vitorrgg vitorrgg commented Aug 3, 2026

Copy link
Copy Markdown
Member

Problema

Produtos do tipo kit (com kit_composition) eram renderizados na seção de detalhes como um produto comum: a composição nunca era listada e, quando os itens do kit tinham variações, eles iam para o carrinho sem SKU selecionado.

Exemplo real (loja demo 1011, DEMO-NICHO-kit-camisaria-masculina): três camisas, cada uma com has_variations: true e 5 tamanhos — não havia como escolher o tamanho de cada peça.

Junto com isso, a camada de dados tinha três defeitos:

  • Estoque do kit calculado ao contrárioloadKitItems pegava o maior floor(estoque / qnt) entre os itens em vez do menor, liberando mais kits do que os componentes permitem.
  • Item do kit se fundia com item avulsokit_product era gravado depois do addCartItem, então um componente já presente no carrinho era mesclado e passava a ser tratado como item de kit.
  • Frete calculado com o produto-kit, que normalmente não tem peso nem dimensões, em vez dos componentes reais.

Mudanças

use-product-card.ts

  • kitItemFields passa a trazer variations, visible, base_price e min_quantity
  • loadKitItems deduplica IDs, é idempotente e usa o mínimo entre os itens, respeitando kit_composition[].variation_id fixo
  • loadToCart aceita kitVariationIds, valida SKU e estoque item a item, agrupa produtos repetidos na composição e monta kit_product (com variation_id em composition) antes de inserir no carrinho

use-product-details.ts

  • expõe isKit, kitComposition, selectKitVariation e isLoadingKitItems
  • carrega os itens do kit no onMounted
  • isSkuSelected passa a exigir variação escolhida em cada slot do kit, reaproveitando o alerta já existente
  • shippedItems passa a ser a composição real do kit

KitComposition.vue (novo, em @@sf/components)

  • lista "Este kit contém" com foto, nome linkado, badge de quantidade, aviso de indisponível e skeletons durante o carregamento
  • slot variations para o tema injetar seu próprio seletor de SKU, com <select> como fallback

Tema

A renderização em si exige uma alteração correspondente em ecomplus/store (functions/ssr/src/components/ProductDetails.vue): incluir o <KitComposition> passando o SkuSelector do tema no slot, esconder o "Comprar agora" direto em kits (o link por product_id não explode a composição) e usar i19buyKit no CTA. Vai em PR separado.

Verificação

  • tsc --noEmit e ESLint limpos nos arquivos alterados
  • templates Vue compilam sem erro
  • dev server contra a loja demo 1011: /kit-camisaria-tres-basicas responde 200 com o bloco da composição renderizado, e uma página não-kit segue idêntica
  • API confirmada devolvendo as 5 variações com specifications de cada componente

Não deu para exercitar o clique/hidratação (escolher tamanho → adicionar ao carrinho) sem navegador — vale um teste manual antes do merge.

🤖 Generated with Claude Code

vitorrgg and others added 2 commits August 3, 2026 19:24
Kit products (`kit_composition`) were rendered like plain products: the
composition was never listed and kit items with variations went to cart
without a selected SKU.

- `use-product-details`: expose `isKit`, `kitComposition` and
  `selectKitVariation`, load kit items on mount and require a variation
  per composition slot before buying; shipping is now calculated with the
  kit items instead of the (weightless) kit product
- `use-product-card`: fetch `variations` for kit items, honor a fixed
  `kit_composition[].variation_id`, cap kit quantity by the least
  available item (was taking the max) and set `kit_product` before adding
  to cart, otherwise a matching standalone item on cart was merged into
  the kit
- new `KitComposition.vue` shared component listing each item with
  picture, link and quantity, with a `variations` slot for theme SKU
  selectors

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Splits the kit branch into `matchKitItem`, `sumToKitComposition` and
`parseKitCartItems`, dropping `loadToCart` back under the complexity
threshold flagged by CodeFactor. No behavior change.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant