UNPKG

finx-analytics-sdk

Version:

148 lines (122 loc) 3.58 kB
// src/attribution.js function storeAttributionParams() { const params = new URLSearchParams(window.location.search); const keys = [ "utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content", "gclid", "fbclid", ]; keys.forEach((key) => { const value = params.get(key); console.log(`Storing attribution param: ${key} = ${value}`); if (value) localStorage.setItem(key, value); }); } function getStoredAttribution() { const keys = [ "utm_source", "utm_medium", "utm_campaign", "utm_term", "utm_content", "gclid", "fbclid", ]; const data = {}; keys.forEach((key) => { const value = localStorage.getItem(key); if (value) data[key] = value; }); return data; } function identifyUser(userId, traits = {}) { const rudderanalytics = window.rudderanalytics; if (!rudderanalytics) return; rudderanalytics.identify(userId, { ...traits, ...getStoredAttribution(), }); } let trackingSetUp = false; function setupGlobalTracking() { if (trackingSetUp) { console.warn("⚠️ Global tracking already set up."); return; } const rudderanalytics = window.rudderanalytics; if (!rudderanalytics) return; console.log("📈 Global tracking setup initialized"); document.addEventListener("click", (e) => { const el = e.target.closest("[data-click-track]"); if (!el) return; const event = el.dataset.clickTrack; const ctaName = el.dataset.ctaName; rudderanalytics.track(event, { cta_name: ctaName, ...getStoredAttribution(), }); }); let lastHoverTime = 0; document.addEventListener( "mouseenter", (e) => { const target = e.target; if (!(target instanceof Element)) return; const now = Date.now(); if (now - lastHoverTime < 5000) return; // debounce lastHoverTime = now; const el = target.closest("[data-hover-track]"); if (!el) return; const event = el.dataset.hoverTrack; const ctaName = el.dataset.ctaName; console.log("👀 Hovering:", event); rudderanalytics.track(event, { cta_name: ctaName, ...getStoredAttribution(), }); }, true ); trackingSetUp = true; } //TODOS // Add more event types like scroll, focus, etc. // src/initAnalytics.js let initialized = false; async function initAnalytics({ writeKey, dataplaneUrl }) { if (initialized) { console.warn("⚠️ RudderStack already initialized. Skipping."); return; } await loadRudderScript(); if ( !window.rudderanalytics || typeof window.rudderanalytics.load !== "function" ) { throw new Error("❌ RudderStack not available"); } window.rudderanalytics.load(writeKey, dataplaneUrl); window.rudderanalytics.ready(() => { console.log("✅ RudderStack initialized"); storeAttributionParams(); window.rudderanalytics.page(undefined, undefined, getStoredAttribution()); setupGlobalTracking(); }); initialized = true; } function loadRudderScript() { return new Promise((resolve, reject) => { if (window.rudderanalytics) return resolve(); const script = document.createElement("script"); script.src = "https://cdn.rudderlabs.com/v1/rudder-analytics.min.js"; script.async = true; script.onload = resolve; script.onerror = reject; document.head.appendChild(script); }); } export { identifyUser, initAnalytics };