// gtmActions.js const gtmActions = { /** * Dispara o evento "view_item_list" do Google Analytics 4 (GA4) com uma lista de itens visualizados. * * @param {Array} items - Lista de itens (produtos ou eventos) que o usuário visualizou. * Cada item do array deve seguir o formato esperado pelo GA4 */ viewItemList: function (items) { if (!window.gtag || !Array.isArray(items)) { console.warn("gtag não está disponível ou items inválidos."); return; } const parsedItems = items.map((item) => ({ ...item, item_id: Number(item.item_id), })); gtag("event", "view_item_list", { item_list_id: "lista_partidas", item_list_name: "Lista de Partidas", items: parsedItems, }); }, /** * Dispara o evento "select_item" do GA4 quando o usuário seleciona um item da lista. * * @param {Object} item - Objeto do item selecionado, com estrutura compatível com GA4. * O item será enviado dentro de um array, como exigido pela especificação. */ selectItem: function (item) { if (!window.gtag || typeof item !== 'object') { console.warn("gtag não está disponível ou item inválido."); return; } item.item_id = Number(item.item_id); gtag("event", "select_item", { item_list_id: "lista_partidas", item_list_name: "Lista de Partidas", items: [item], }); }, /** * Dispara o evento "view_item" do GA4 quando um item específico é visualizado. * * @param {Object} item - Objeto do item visualizado, com estrutura compatível com GA4. * O item será enviado dentro de um array, como exigido pela especificação. */ viewItem: function (item) { if (!window.gtag || typeof item !== 'object') { console.warn("gtag não está disponível ou item inválido."); return; } gtag("event", "view_item", { items: [item], }); }, /** * Dispara o evento "add_to_cart" do GA4 quando um item específico é visualizado. * * @param {int} sectorId * O item será enviado dentro de um array, como exigido pela especificação. */ addToCart: function (sectorId, quantity = 1) { if (!window.gtag) { console.warn("gtag não está disponível."); return; } const selector = `[data-sector="${sectorId}"]`; const element = document.querySelector(selector); if (!element) { console.warn("Setor não encontrado no DOM:", selector); return; } const itemData = element.getAttribute('data-sector-item'); if (!itemData) { console.warn("data-sector-item não encontrado para o setor:", sectorId); return; } let item; try { item = JSON.parse(itemData); } catch (e) { console.warn("Erro ao fazer parse do item:", e); return; } item.quantity = quantity; let price = item.price; if (typeof price === "string") { price = price.replace(/\./g, '').replace(',', '.'); price = Number(price); item.price = price; } gtag("event", "add_to_cart", { currency: "BRL", items: [item], }); }, /** * Dispara o evento "view_cart" do GA4 ao carregar a tela do carrinho. * * @param {Array} items - Lista de itens no carrinho, compatível com GA4. */ viewCart: function (items, value) { if (!window.gtag || !Array.isArray(items)) { console.warn("gtag não está disponível ou os itens são inválidos."); return; } const parsedItems = items.map((item) => { const itemId = Number(item.item_id); let price = item.price; if (typeof price === "string") { price = Number(price); } return { ...item, item_id: itemId, price: price, }; }); let parsedValue = value; if (typeof value === "string") { parsedValue = value.replace(/\./g, '').replace(',', '.'); parsedValue = Number(parsedValue); } gtag("event", "view_cart", { currency: "BRL", value: parsedValue, items: parsedItems }); }, /** * Dispara o evento "remove_from_cart" do GA4 quando um ou mais itens são removidos do carrinho. * * @param {Array} items - Lista de itens removidos, compatível com GA4. */ removeFromCart: function (items) { if (!window.gtag || !Array.isArray(items) || items.length === 0) { console.warn("gtag não está disponível ou os itens são inválidos."); return; } const parsedItems = items.map((item) => { const itemId = Number(item.item_id); let price = item.price; if (typeof price === "string") { price = Number(price); } return { ...item, item_id: itemId, price: price, }; }); gtag("event", "remove_from_cart", { items: parsedItems }); }, /** * Dispara o evento "begin_checkout" do GA4 quando o usuário inicia o checkout. * * @param {Array} items - Lista de itens no carrinho, compatível com GA4. */ beginCheckout: function (items, value) { if (!window.gtag || !Array.isArray(items) || items.length === 0) { console.warn("gtag não está disponível ou os itens são inválidos."); return; } const coupon = localStorage.getItem("coupon") || null; const parsedItems = items.map((item) => { const itemId = Number(item.item_id); let price = item.price; if (typeof price === "string") { price = Number(price); } return { ...item, item_id: itemId, price: price, }; }); let parsedValue = value; if (typeof value === "string") { parsedValue = value.replace(/\./g, '').replace(',', '.'); parsedValue = Number(parsedValue); } gtag("event", "begin_checkout", { currency: "BRL", value: parsedValue, coupom: coupon, items: parsedItems }); }, /** * Dispara o evento "add_payment_info" do GA4 quando o usuário informa o método de pagamento. * * @param {string} paymentMethod - Nome do método de pagamento (ex: "PIX", "Cartão de Crédito"). */ addPaymentInfo: function (paymentMethod) { const paymentDiv = document.querySelector('.payment_resume-total'); const totalElement = document.querySelector('.payment-resume-highlight'); if (!paymentDiv || !totalElement) { console.warn("Elementos de pagamento não encontrados."); return; } const paymentData = paymentDiv.getAttribute('data-payment-data'); let items = []; try { items = JSON.parse(paymentData); } catch (e) { console.error("Erro ao fazer parse do data-payment-data:", e); return; } const rawTotal = totalElement.textContent || ''; let numericTotal = rawTotal .replace(/[^\d.,]/g, '') // remove tudo exceto dígitos, ponto e vírgula .replace(/\./g, '') // remove pontos (milhar) .replace(',', '.'); // troca vírgula decimal por ponto numericTotal = Number(numericTotal); if (isNaN(numericTotal)) { console.warn("Valor total inválido:", rawTotal); return; } if (!window.gtag) { console.warn("gtag não está disponível."); return; } gtag("event", "add_payment_info", { currency: "BRL", value: numericTotal, payment_type: paymentMethod, items: items }); }, /** * Dispara o evento "purchase" do GA4 na tela de pagamento concluído. * * @param {string} transactionId - ID da transação. * @param {number} value - Valor total da compra. * @param {number} tax - Valor do imposto. * @param {Array} items - Lista de itens comprados. */ purchase: function (transactionId, value, tax, items) { if (!window.gtag || !transactionId || !Array.isArray(items) || items.length === 0) { console.warn("Parâmetros inválidos ou gtag não disponível."); return; } const parsedItems = items.map((item) => ({ ...item, item_id: Number(item.item_id), })); // Conversão de valores no formato BR para número const parseBRLToNumber = (str) => { if (typeof str !== "string") return str; return Number(str.replace(/\./g, '').replace(',', '.')); }; const parsedValue = parseBRLToNumber(value); const parsedTax = parseBRLToNumber(tax); gtag("event", "purchase", { transaction_id: Number(transactionId), value: parsedValue, tax: parsedTax, currency: "BRL", items: parsedItems }); } }; window.gtmActions = gtmActions;