Skip to main content

Erros comuns (temas e agências)

Guia rápido para evitar bugs recorrentes ao consumir a Storefront Data API.

1. Imagem de categoria/coleção

❌ Errado

O browser recebe [object Object] e a imagem quebra.

✅ Correto

Produtos seguem o mesmo padrão: use product.featuredImage?.url ou getProductImage(product).

2. Coleção ≠ entidade separada

Filtrar produtos por coleção:

3. useCorvexData e formato do retorno

O hook legado retorna Connection<T> com nodes. Sempre normalize:
Não assuma que data é array.

4. limit vs first


5. Produtos por categoria + status

❌ Evite

✅ Prefira

Detalhes: products.list — Status e categoria.

6. Picker collection salva UUID

No inspector, type: "collection" persiste o UUID da categoria, não o handle:
Passe esse valor direto para collection / categoryId na query de produtos.

7. Contexto de página vs fetch extra

Em template product, a plataforma já injeta o produto:

❌ Redundante na PDP

Em template collection, use page.collection e page.products — não busque de novo sem motivo.

8. Blocks e snippets não fazem fetch

Só sections (via defineSectionData ou useCorvexData no componente da section) buscam catálogo.
Ver Regras de escopo.

9. available vs inStock

Código legado usava available: true. A API pública espera:

10. Aliases de ordenação

O SDK aceita aliases comuns de ordenação e normaliza para o backend:

11. Preview no editor (URL)

Além de ?theme= e ?version=, o editor persiste estado de preview: Exemplo:
Ver Contexto de página.

12. Preview responsivo no editor

O canvas do editor reduz a largura do container (390px mobile, 768px tablet), mas @media e window.matchMedia usam a janela do browser por padrão. O host emula o device quando você troca o ícone Desktop / Tablet / Mobile:
  • Reaplica regras CSS do tema como se a viewport tivesse a largura do device
  • Patcheia matchMedia para JS que usa breakpoints (ex.: menu mobile)
No tema: prefira category.image?.url e, se usar window.innerWidth / matchMedia, considere useEditorPreviewState ou CSS puro com @media. Recarregue o editor após atualizar o host. O preview em /preview e no celular real não precisam dessa emulação.

13. Editor — blocks e carrossel

Erros do canvas, não da Data API. Nunca:
  • Renderizar {children} em dois lugares.
  • Usar SectionBlockCanvas na vitrine publicada.
  • Chamar um callback dentro de setPage((current) => { … return next }).
Guia: Runtime API.

14. Vazamento de CSS (tema para o builder)

No editor, tema e builder compartilham a mesma página. Se o tema grava cores em :root ou em document.documentElement, a UI do editor herda essas variáveis.

❌ Errado

✅ Correto

Defina variáveis só nas raízes do tema (layout, header, footer):
A plataforma aplica settings do painel Tema em .cx-theme-scope — o CSS do tema também deve ficar escopado. Guia completo: Escopo CSS — tema vs editor.

15. Canvas do builder branco

Sintoma

  • /preview e vitrine ok
  • Canvas do editor (/?store=…) branco, sem erro no console
  • Seções aparecem na árvore lateral

Causas

✅ Correto

Guia completo: Compatibilidade iframe do editor

16. Vídeo com UUID no src

❌ Errado

O browser não reproduz UUID; o hero fica vazio ou quebra silenciosamente.

✅ Correto

Guia completo: Biblioteca de vídeos · FAQ.

17. Carrossel de vídeos e loop HLS

❌ Errado — recriar HLS quando visibilidade muda

Também evite:
  • playWhenVisible em faixa marquee com autoplay (observer instável com animação CSS)
  • video.src = manifest.m3u8 após erro fatal do Hls.js
  • Resolver UUID / fetch de /playback dentro do block em vez do snippet CorvexVideo

✅ Correto

Guia completo: Carrossel de vídeos (Reels).

❌ Errado — misturar modelos na mesma expectativa

  • Editar blocos na seção Início (main) e esperar que o carrossel Vitrine de produtos (product-list + snippet) mude.
  • Repetir renderCatalogProductBlocks com blocks desatualizados no editor sem useSectionLiveBlocks().
  • Colocar type errado em blocks[id] (todos catalog-product-image) — sintoma: várias imagens, sem título/descrição.
  • order no template apontando para "main" sem objeto sections.main com blocks + block_order.

✅ Correto

  • Snippet: import ProductCard from '@corvex/snippets/product-card' — card fixo; customização via settings da section ou props do snippet. Ver Product Card.
  • Blocos de catálogo: section busca produtos; cada item da grade usa a mesma block_order; blocks leem produto via contexto. Ver Grade com blocos de catálogo.
  • Persistência: blocks e block_order (template e publicação). No editor, useSectionLiveBlocks() espelha os tipos ao vivo.
  • O tipo é a pasta blocks/{id}/. Se schema.json tiver type, use o mesmo id. name é o rótulo no editor e pode mudar.
  • No editor, monte {children} no primeiro card da grade — não em host oculto com clip/aria-hidden (seleção de bloco fica desalinhada).

Checklist antes de publicar section

  • Imagens usam .url ou imageUrl, nunca objeto Image no src
  • Listas normalizam data.nodes
  • Filtro por coleção usa UUID do picker
  • inStock em vez de status=PUBLISHED com categoria
  • Snippets/blocks não chamam API
  • PDP/collection usam usePage() quando aplicável
  • Sections com blocks: {children} uma vez, sem propriedade estática no componente, corvex build e sync. Runtime API
  • Carrossel com blocks: não mapear children como slides
  • Vídeo: nunca src={uuid} — usar CorvexVideo ou classificar valor (guia)
  • Carrossel de vídeos: HLS não recriado em shouldPlay — ver Carrossel de vídeos
  • CSS escopado: sem :root global; builder não herda cores do tema — Escopo CSS
  • Builder iframe não branco: editorPreviewRootClasses + regras iframe — Compatibilidade iframe

Referências