Skip to main content
Enquanto os eventos permitem reagir ao carrinho e as ações permitem alterá-lo, os hooks mudam como o próprio carrinho se comporta: como as linhas são renderizadas, quais dados elas carregam e o que acontece na adição ao carrinho. Os hooks ficam em window.aftersell.cart.hooks.
Um hook muda o que o comprador ; uma ação muda o que está no carrinho dele. Ocultar uma linha de brinde com um transform a mantém no carrinho e no total. Removê-la com removeItem a tira de verdade.
Hooks são chamadas de configuração, então é seguro registrá-los logo no topo do seu script, sem precisar esperar por ready(). Registre-os no script de Initialization do seu carrinho (veja Scripts personalizados).

Como o registro funciona

Todo hook é um método register*. Você o chama com a sua função; ele retorna uma função de desregistro que você pode chamar para remover a sua.
O registro é aditivo, então a sua função roda ao lado de todas as outras. Isso importa porque o seu script raramente é o único na página: um app de assinatura, um app de bundle e o próprio tema podem todos se registrar no mesmo hook. Nenhum deles pode substituir o seu, e nada que você registrar pode ser silenciosamente descartado pelo que carregar depois de você. Um hook que lança um erro, ou que não é uma função, é pulado; os demais ainda rodam, e o carrinho continua funcionando. Uma integração quebrada não consegue derrubar a adição ao carrinho, o seletor de assinatura ou a ordenação. O outro lado é que um hook seu quebrado falha silenciosamente: nada chega ao console do navegador. Veja Depuração para saber onde essas falhas aparecem.

registerLineTransform

registerLineTransform(fn) roda para cada linha do carrinho antes de ela ser renderizada. Use-o para ocultar uma linha ou mudar como ela é exibida, sem tocar no que realmente está no carrinho do comprador. A função recebe uma linha somente leitura mais setters. Retorna uma função de desregistro.
Um transform só muda o que é renderizado. Ele não pode mudar preço, quantidade ou identidade da linha. Use as ações para isso.
Use para: ocultar linhas de brinde-com-compra ou injetadas por apps, rerrotular linhas de assinatura, marcar itens com desconto, ocultar componentes de bundle que o comprador não deveria gerenciar individualmente. setInternalProperties é o setter por trás do agrupamento de bundles: carimbar as propriedades canônicas de bundle em cada linha é como você faz linhas separadas de um app de terceiros serem renderizadas como um único item. Veja Agrupar linhas de bundle de outro app.

registerLineComparator

Um comparator no mesmo formato que Array.prototype.sort espera. Ele roda depois de ocultar e renomear, então vê as linhas transformadas.
Comparators compõem-se como critérios de desempate: o primeiro a retornar um valor diferente de zero decide aquele par, e os demais são consultados apenas em empates. Retorne 0 para pares sobre os quais você não tem opinião. É isso que passa a decisão para o próximo comparator em vez de impor uma ordem a ele. Use para: subir assinaturas ou itens de alto valor para o topo, afundar brindes e complementos para o final, manter um produto patrocinado em primeiro.

registerCartEnricher

registerCartEnricher(registration) busca dados extras de produto ou variante na Storefront API do Shopify e os anexa a cada linha correspondente do carrinho em line.metadata[id]. Use-o para exibir metafields, tags ou qualquer outra coisa que a Storefront API exponha, sem necessidade de alteração de código pelo Aftersell. Retorna uma função de desregistro. Sempre que o carrinho carrega ou muda, o Aftersell busca o seu fragment para cada produto ou variante no carrinho e anexa o resultado. A busca não é bloqueante: o carrinho é renderizado imediatamente e reemite cart_updated quando os dados chegam. Um fragment lento ou com falha nunca atrasa nem quebra o carrinho.
Como o enriquecimento é assíncrono, sempre proteja a leitura, já que line.metadata.pricing é undefined até a primeira busca resolver, e metadata em si tem {} como padrão. Use para: puxar um metafield para cada linha (uma estimativa de entrega, uma lista de ingredientes, uma flag de “enviado separadamente”, um multiplicador de fidelidade) e renderizá-lo por meio de um bloco Custom code. Veja exibindo dados de metafield nas linhas do carrinho.
Vários enrichers coexistem tranquilamente, já que cada id é seu próprio namespace, então os dados nunca colidem.
Valores enriquecidos são retornados como estão da Storefront API e não são sanitizados. Renderize-os como texto, não como HTML bruto.

registerSubscriptionOptionsTransform

Oculte ou renomeie os selling plans oferecidos em uma linha. Sua função recebe opções somente leitura mais setters, e não retorna nada.
Setters, e não uma lista retornada, para que vários scripts possam coexistir. Se este hook retornasse um array, um transform que só se importa com um plano naturalmente escreveria options.filter(...) e apagaria silenciosamente os planos de todos os outros apps no caminho. Com setters você só consegue descrever as suas próprias edições: os patches se mesclam por plano e por campo, e o último a escrever vence um conflito genuíno no mesmo campo do mesmo plano. Um transform que lança um erro não contribui com nada, e os outros ainda se aplicam. Todo transform vê as opções originais, não uma visão parcialmente aplicada, então a ordem de registro não muda o que você está lendo.
A ordem dos planos permanece como o Shopify retornou, então um transform não pode reordenar. Para controlar qual plano é oferecido primeiro (e a qual plano o botão de upgrade de compra única assina), use registerDefaultSubscriptionOptionSelector, que promove a escolha dele para a frente.
Você também não pode adicionar um plano nem mudar um preço: discountPercent não tem setter, porque um plano que o Shopify não honraria no checkout seria só uma promessa quebrada no seletor.

registerDefaultSubscriptionOptionSelector

Escolha qual plano vem pré-selecionado em uma linha. Retorne um id de plano, ou null para passar a vez.
O primeiro selector a retornar o id de um plano disponível vence, então retorne null para as linhas com que você não se importa em vez de adivinhar. Isso passa a decisão para o próximo selector em vez de sobrescrevê-la. Um id que não corresponde a nenhum plano na linha é tratado como null e também cede a vez, então um id obsoleto não consegue zerar o seletor. Sua função recebe (options, context), o mesmo context que o transform de opções recebe.

registerSkipAddToCartRule

Retorne true para deixar um formulário de produto específico adicionar ao carrinho normalmente, ignorando o Aftersell por completo. Isso é útil para um formulário que precisa do próprio redirecionamento ou tratamento.
Qualquer true pula, então mantenha sua regra restrita, correspondendo aos formulários específicos que você controla, e retorne false para todo o resto. As regras são avaliadas em ordem de registro e param no primeiro true, então não coloque efeitos colaterais em uma: se a sua roda ou não depende do que foi registrado antes dela.
Se você controla a marcação do formulário, nem precisa de um hook: adicione a classe aftersell-cart-skip-atc ao <form> e o Aftersell o deixa em paz. Use este hook quando você não pode editar a marcação, ou quando a decisão depende de algo que só o seu código sabe.
Use para: um formulário de pré-venda ou orçamento que precisa do próprio redirecionamento, o fluxo personalizado de um app de assinatura, um botão de “comprar agora” que deve ir direto para o checkout. Para desativar a interceptação na página inteira, use skip_add_to_cart_interceptor, mas prefira este hook, que é limitado aos formulários que você nomeia.

Para onde ir agora