finx-analytics-sdk
Version:
148 lines (122 loc) • 3.58 kB
JavaScript
// 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 };