<script>. On cart update tem uma ação Reset to default que restaura seu template inicial; Initialization não tem, então guarde sua própria cópia antes de limpá-lo.
Muito do que os lojistas costumavam fazer por script agora é uma configuração nativa. Confira Antes de escrever um script primeiro: uma configuração continua funcionando através de redesigns do carrinho, e seu script pode não continuar.
Qual slot usar
Initialization
window.aftersell.cart.
Chamadas de configuração que você faz aqui (configure(...), events.on(...), hooks.*) são seguras de chamar no topo do script mesmo antes de o carrinho ter inicializado completamente; elas são armazenadas em buffer e aplicadas quando ele inicializa. Ações que leem ou alteram o carrinho (como addItem ou getCart) devem rodar dentro de ready() ou de um handler de evento.
O slot começa com três exemplos comentados — abrir o drawer a cada adição, reagir a cart_loaded e ocultar linhas de brinde grátis — então um script Initialization intocado não faz nada. Descomente um para testar, ou substitua-os.
O formato natural para este slot é um registro único sem eventos envolvidos: registre o comportamento uma vez e deixe o carrinho aplicá-lo dali em diante. Ocultar linhas de brinde grátis do drawer, sem alterar o total, é o exemplo fornecido disso:
registerLineTransform executa para cada linha conforme ela é renderizada, e setHidden é apenas de exibição, então a linha permanece no carrinho e ainda conta para o total, ela só não aparece no drawer. Veja Ocultar e rotular linhas do carrinho para mais do que um transform pode fazer.
Ações que leem o carrinho vão dentro de ready():
shadowRoot: o carrinho é renderizado dentro de um shadow root, então document.querySelector não consegue ver nada no drawer.
On cart update
cart_updated, então você edita apenas o corpo, e seu código recebe o cart atualizado.
Este slot é para regras que precisam ser reavaliadas a cada mudança do carrinho. Um limite de brinde grátis é o caso clássico (gaste $75, ganhe uma sacola grátis), porque a resposta depende do conteúdo atual e nada mais consegue avisar quando ele muda:
Mantendo o carrinho em um estado desejado
if (shouldHaveGift === hasGift) return; é o que torna isso seguro, e ela se generaliza para todo script que mantém o carrinho em um estado desejado. Este slot tanto reage a mudanças do carrinho quanto as causa, então cada addItem ou removeItem o reexecuta. Descreva o estado que você quer, compare com o estado que você tem e retorne cedo quando eles já concordam, para que o handler convirja depois de uma passada em vez de entrar em loop. Veja as duas regras para a versão sem proteção a evitar e por que o payload é somente leitura.
Em uma loja mais lenta, também vale manter uma flag de operação em andamento no nível do módulo, para que duas mudanças rápidas não possam ambas iniciar uma adição antes de a primeira ser concluída.
cart_updated dispara apenas em mudanças depois do primeiro carregamento (timing de eventos), então um script neste slot não vai reconciliar um carrinho que já se qualifica quando a página carrega. Para uma versão que trata os dois casos, assine cart_loaded e cart_updated com a mesma função a partir do slot Initialization. Veja Adicionar automaticamente um brinde grátis em um limite.Quando um script quebra
configure, events.on ou hooks.register* mais abaixo nunca é registrado. Essa é a explicação usual para “meu handler nunca dispara” quando o código parece correto.
O carrinho indica a linha com falha no console do navegador, e cada slot roda sob seu próprio nome de arquivo (aftersell-cart-init.js e aftersell-cart-cart-update.js), então você pode abrir qualquer um pelo painel Sources do DevTools e definir breakpoints. Veja Depuração para as mensagens exatas e para o canal de debug que captura falhas de hooks mantidas fora do console.
Como cart_loaded é reproduzido para assinantes tardios, a ordem de registro nunca importa. A estrutura mais segura é registrar tudo primeiro e fazer o trabalho arriscado dentro dos handlers, onde um throw fica isolado naquele handler.
Por onde continuar
- Cart SDK: os scripts personalizados são a forma de executar código do SDK. Veja as referências de configure, eventos, ações e hooks para a superfície completa, o objeto de carrinho para a estrutura do que os handlers recebem, e os casos de uso para snippets prontos.
- Blocos Custom code: para adicionar marcação ao carrinho. Note que o modo HTML do bloco Custom code não executa JavaScript; use scripts personalizados (ou o modo React do bloco) para lógica.