@zaplier/sdk 1.6.7 → 1.6.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -19265,21 +19265,85 @@ class SessionReplayEngine {
19265
19265
  class AutoTracker {
19266
19266
  constructor(sdkInstance, config = {}) {
19267
19267
  this.observedElements = new Set();
19268
- /**
19269
- * Event handlers (bound to this)
19270
- */
19271
- this.handleClick = (event) => {
19272
- const target = event.target;
19273
- if (target.hasAttribute("data-track-click")) ;
19274
- };
19268
+ this.scrollThrottle = 0;
19275
19269
  this.handleScroll = () => {
19276
- // Scroll is handled by element-specific listeners
19277
- };
19278
- this.handleHover = (event) => {
19279
- // Hover is handled by element-specific listeners
19270
+ if (!this.config.trackScrolls)
19271
+ return;
19272
+ // Throttle scroll events for performance
19273
+ const now = Date.now();
19274
+ if (now - this.scrollThrottle < 100)
19275
+ return; // 100ms throttle
19276
+ this.scrollThrottle = now;
19277
+ const scrollElements = document.querySelectorAll('[data-track-scroll]');
19278
+ if (this.config.debug && scrollElements.length > 0) {
19279
+ console.log(`[AutoTracker] Checking ${scrollElements.length} scroll elements`, {
19280
+ scrollY: window.scrollY,
19281
+ innerHeight: window.innerHeight
19282
+ });
19283
+ }
19284
+ scrollElements.forEach((element) => {
19285
+ let hasTriggered = element.getAttribute('data-scroll-triggered') === 'true';
19286
+ if (hasTriggered)
19287
+ return;
19288
+ const threshold = parseFloat(element.getAttribute("data-scroll-threshold") || "0.5");
19289
+ const rect = element.getBoundingClientRect();
19290
+ const elementHeight = rect.height;
19291
+ const visibleHeight = Math.min(rect.bottom, window.innerHeight) - Math.max(rect.top, 0);
19292
+ const visibilityRatio = Math.max(0, visibleHeight) / elementHeight;
19293
+ if (this.config.debug) {
19294
+ console.log(`[AutoTracker] Element check:`, {
19295
+ elementId: element.id || element.className,
19296
+ visibilityRatio: Math.round(visibilityRatio * 100) / 100,
19297
+ threshold,
19298
+ triggered: hasTriggered
19299
+ });
19300
+ }
19301
+ if (visibilityRatio >= threshold) {
19302
+ element.setAttribute('data-scroll-triggered', 'true');
19303
+ const eventName = element.getAttribute("data-track-scroll");
19304
+ if (!eventName)
19305
+ return;
19306
+ const metadata = this.extractMetadata(element);
19307
+ this.trackEvent(eventName, {
19308
+ type: "scroll",
19309
+ element: element.tagName.toLowerCase(),
19310
+ threshold,
19311
+ scrollDepth: window.scrollY,
19312
+ visibilityRatio: Math.round(visibilityRatio * 100) / 100,
19313
+ ...metadata,
19314
+ });
19315
+ if (this.config.debug) {
19316
+ console.log(`[AutoTracker] Scroll tracked: ${eventName}`, {
19317
+ threshold,
19318
+ visibilityRatio,
19319
+ scrollDepth: window.scrollY,
19320
+ ...metadata
19321
+ });
19322
+ }
19323
+ }
19324
+ });
19280
19325
  };
19281
- this.handleForm = (event) => {
19282
- // Form is handled by element-specific listeners
19326
+ this.handleClick = (event) => {
19327
+ if (!this.config.trackClicks)
19328
+ return;
19329
+ const target = event.target;
19330
+ if (!target || !target.hasAttribute("data-track-click"))
19331
+ return;
19332
+ const eventName = target.getAttribute("data-track-click");
19333
+ if (!eventName)
19334
+ return;
19335
+ const metadata = this.extractMetadata(target);
19336
+ this.trackEvent(eventName, {
19337
+ type: "click",
19338
+ element: target.tagName.toLowerCase(),
19339
+ ...metadata,
19340
+ });
19341
+ if (this.config.debug) {
19342
+ console.log(`[AutoTracker] Click tracked: ${eventName}`, {
19343
+ element: target.tagName.toLowerCase(),
19344
+ ...metadata
19345
+ });
19346
+ }
19283
19347
  };
19284
19348
  this.sdkInstance = sdkInstance;
19285
19349
  this.config = {
@@ -19300,7 +19364,36 @@ class AutoTracker {
19300
19364
  if (!this.config.enabled)
19301
19365
  return;
19302
19366
  if (this.config.debug) {
19303
- console.log("[Zaplier AutoTracker] Iniciando auto tracking");
19367
+ console.log("[Zaplier AutoTracker] Iniciando auto tracking", {
19368
+ enabled: this.config.enabled,
19369
+ trackClicks: this.config.trackClicks,
19370
+ trackScrolls: this.config.trackScrolls,
19371
+ trackViews: this.config.trackViews,
19372
+ trackHovers: this.config.trackHovers,
19373
+ trackForms: this.config.trackForms
19374
+ });
19375
+ // Log elementos existentes encontrados
19376
+ setTimeout(() => {
19377
+ const clickElements = document.querySelectorAll('[data-track-click]');
19378
+ const scrollElements = document.querySelectorAll('[data-track-scroll]');
19379
+ const viewElements = document.querySelectorAll('[data-track-view]');
19380
+ const hoverElements = document.querySelectorAll('[data-track-hover]');
19381
+ const formElements = document.querySelectorAll('[data-track-form]');
19382
+ console.log("[Zaplier AutoTracker] Elementos encontrados:", {
19383
+ clickElements: clickElements.length,
19384
+ scrollElements: scrollElements.length,
19385
+ viewElements: viewElements.length,
19386
+ hoverElements: hoverElements.length,
19387
+ formElements: formElements.length
19388
+ });
19389
+ if (scrollElements.length > 0) {
19390
+ console.log("[Zaplier AutoTracker] Elementos de scroll:", Array.from(scrollElements).map(el => ({
19391
+ tagName: el.tagName,
19392
+ trackEvent: el.getAttribute('data-track-scroll'),
19393
+ threshold: el.getAttribute('data-scroll-threshold') || '0.5'
19394
+ })));
19395
+ }
19396
+ }, 100);
19304
19397
  }
19305
19398
  // Observer para novos elementos no DOM
19306
19399
  this.observeDOM();
@@ -19310,6 +19403,13 @@ class AutoTracker {
19310
19403
  if (this.config.trackViews) {
19311
19404
  this.setupViewTracking();
19312
19405
  }
19406
+ // Setup global event listeners
19407
+ if (this.config.trackClicks) {
19408
+ document.addEventListener("click", this.handleClick, { passive: true });
19409
+ }
19410
+ if (this.config.trackScrolls) {
19411
+ document.addEventListener("scroll", this.handleScroll, { passive: true });
19412
+ }
19313
19413
  }
19314
19414
  /**
19315
19415
  * Parar auto tracking
@@ -19317,8 +19417,6 @@ class AutoTracker {
19317
19417
  stop() {
19318
19418
  document.removeEventListener("click", this.handleClick);
19319
19419
  document.removeEventListener("scroll", this.handleScroll);
19320
- document.removeEventListener("mouseover", this.handleHover);
19321
- document.removeEventListener("submit", this.handleForm);
19322
19420
  if (this.intersectionObserver) {
19323
19421
  this.intersectionObserver.disconnect();
19324
19422
  }
@@ -19356,14 +19454,8 @@ class AutoTracker {
19356
19454
  * Processar um elemento específico
19357
19455
  */
19358
19456
  processElement(element) {
19359
- // Click tracking
19360
- if (this.config.trackClicks && element.hasAttribute("data-track-click")) {
19361
- this.setupClickTracking(element);
19362
- }
19363
- // Scroll tracking
19364
- if (this.config.trackScrolls && element.hasAttribute("data-track-scroll")) {
19365
- this.setupScrollTracking(element);
19366
- }
19457
+ // Click tracking - handled by global listener
19458
+ // Scroll tracking - handled by global listener
19367
19459
  // View tracking
19368
19460
  if (this.config.trackViews && element.hasAttribute("data-track-view")) {
19369
19461
  this.setupElementViewTracking(element);
@@ -19377,60 +19469,6 @@ class AutoTracker {
19377
19469
  this.setupFormTracking(element);
19378
19470
  }
19379
19471
  }
19380
- /**
19381
- * Setup click tracking
19382
- */
19383
- setupClickTracking(element) {
19384
- element.addEventListener("click", (event) => {
19385
- const eventName = element.getAttribute("data-track-click");
19386
- if (!eventName)
19387
- return;
19388
- const metadata = this.extractMetadata(element);
19389
- this.trackEvent(eventName, {
19390
- type: "click",
19391
- element: element.tagName.toLowerCase(),
19392
- ...metadata,
19393
- });
19394
- if (this.config.debug) {
19395
- console.log(`[AutoTracker] Click tracked: ${eventName}`, metadata);
19396
- }
19397
- });
19398
- }
19399
- /**
19400
- * Setup scroll tracking
19401
- */
19402
- setupScrollTracking(element) {
19403
- let hasTriggered = false;
19404
- const threshold = parseFloat(element.getAttribute("data-scroll-threshold") || "0.5");
19405
- const handleScroll = () => {
19406
- if (hasTriggered)
19407
- return;
19408
- const rect = element.getBoundingClientRect();
19409
- const elementHeight = rect.height;
19410
- const visibleHeight = Math.min(rect.bottom, window.innerHeight) - Math.max(rect.top, 0);
19411
- const visibilityRatio = Math.max(0, visibleHeight) / elementHeight;
19412
- if (visibilityRatio >= threshold) {
19413
- hasTriggered = true;
19414
- const eventName = element.getAttribute("data-track-scroll");
19415
- if (!eventName)
19416
- return;
19417
- const metadata = this.extractMetadata(element);
19418
- this.trackEvent(eventName, {
19419
- type: "scroll",
19420
- element: element.tagName.toLowerCase(),
19421
- threshold,
19422
- scrollDepth: window.scrollY,
19423
- ...metadata,
19424
- });
19425
- if (this.config.debug) {
19426
- console.log(`[AutoTracker] Scroll tracked: ${eventName}`, metadata);
19427
- }
19428
- }
19429
- };
19430
- document.addEventListener("scroll", handleScroll, { passive: true });
19431
- // Check immediately in case element is already in view
19432
- setTimeout(handleScroll, 100);
19433
- }
19434
19472
  /**
19435
19473
  * Setup view tracking usando Intersection Observer
19436
19474
  */