@grainql/analytics-web 3.1.2 → 3.2.1
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/cjs/heatmap-tracking.d.ts +45 -0
- package/dist/cjs/heatmap-tracking.d.ts.map +1 -1
- package/dist/cjs/heatmap-tracking.js +309 -5
- package/dist/cjs/heatmap-tracking.js.map +1 -1
- package/dist/cjs/page-tracking.d.ts.map +1 -1
- package/dist/cjs/page-tracking.js +6 -0
- package/dist/cjs/page-tracking.js.map +1 -1
- package/dist/cjs/types/heatmap-tracking.d.ts +11 -0
- package/dist/cjs/types/heatmap-tracking.d.ts.map +1 -1
- package/dist/esm/heatmap-tracking.d.ts +45 -0
- package/dist/esm/heatmap-tracking.d.ts.map +1 -1
- package/dist/esm/heatmap-tracking.js +276 -5
- package/dist/esm/heatmap-tracking.js.map +1 -1
- package/dist/esm/page-tracking.d.ts.map +1 -1
- package/dist/esm/page-tracking.js +6 -0
- package/dist/esm/page-tracking.js.map +1 -1
- package/dist/esm/types/heatmap-tracking.d.ts +11 -0
- package/dist/esm/types/heatmap-tracking.d.ts.map +1 -1
- package/dist/heatmap-tracking.d.ts +45 -0
- package/dist/heatmap-tracking.d.ts.map +1 -1
- package/dist/heatmap-tracking.js +309 -5
- package/dist/index.global.dev.js +5855 -62
- package/dist/index.global.dev.js.map +4 -4
- package/dist/index.global.js +33 -7
- package/dist/index.global.js.map +4 -4
- package/dist/page-tracking.d.ts.map +1 -1
- package/dist/page-tracking.js +6 -0
- package/dist/types/heatmap-tracking.d.ts +11 -0
- package/dist/types/heatmap-tracking.d.ts.map +1 -1
- package/package.json +8 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-tracking.js","sourceRoot":"","sources":["../../src/page-tracking.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"page-tracking.js","sourceRoot":"","sources":["../../src/page-tracking.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
export interface HeatmapClickData {
|
|
5
5
|
pageUrl: string;
|
|
6
6
|
xpath: string;
|
|
7
|
+
selector?: string;
|
|
8
|
+
relX?: number;
|
|
9
|
+
relY?: number;
|
|
7
10
|
viewportX: number;
|
|
8
11
|
viewportY: number;
|
|
9
12
|
pageX: number;
|
|
@@ -11,6 +14,13 @@ export interface HeatmapClickData {
|
|
|
11
14
|
elementTag: string;
|
|
12
15
|
elementText?: string;
|
|
13
16
|
timestamp: number;
|
|
17
|
+
deviceType: 'mobile' | 'desktop';
|
|
18
|
+
}
|
|
19
|
+
export interface HeatmapSnapshot {
|
|
20
|
+
sessionId: string;
|
|
21
|
+
pageUrl: string;
|
|
22
|
+
snapshot: unknown;
|
|
23
|
+
timestamp: number;
|
|
14
24
|
}
|
|
15
25
|
export interface HeatmapScrollData {
|
|
16
26
|
pageUrl: string;
|
|
@@ -21,6 +31,7 @@ export interface HeatmapScrollData {
|
|
|
21
31
|
exitTimestamp: number;
|
|
22
32
|
pageHeight: number;
|
|
23
33
|
viewportHeight: number;
|
|
34
|
+
deviceType: 'mobile' | 'desktop';
|
|
24
35
|
}
|
|
25
36
|
export interface HeatmapTrackingOptions {
|
|
26
37
|
scrollDebounceDelay: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heatmap-tracking.d.ts","sourceRoot":"","sources":["../../../src/types/heatmap-tracking.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"heatmap-tracking.d.ts","sourceRoot":"","sources":["../../../src/types/heatmap-tracking.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,QAAQ,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,QAAQ,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACnC,kBAAkB,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC9C,aAAa,EAAE,gBAAgB,EAAE,CAAC;IAClC,cAAc,EAAE,iBAAiB,EAAE,CAAC;CACrC"}
|
|
@@ -11,6 +11,8 @@ export interface HeatmapTracker {
|
|
|
11
11
|
trackSystemEvent(eventName: string, properties?: Record<string, unknown>, options?: SendEventOptions): void | Promise<void>;
|
|
12
12
|
hasConsent(category: 'analytics' | 'marketing' | 'functional'): boolean;
|
|
13
13
|
getActivityDetector(): ActivityDetector;
|
|
14
|
+
getConfigAsync(key: string): Promise<string | undefined>;
|
|
15
|
+
getEffectiveUserId(): string;
|
|
14
16
|
log(...args: unknown[]): void;
|
|
15
17
|
}
|
|
16
18
|
export declare class HeatmapTrackingManager {
|
|
@@ -28,11 +30,50 @@ export declare class HeatmapTrackingManager {
|
|
|
28
30
|
private lastScrollTime;
|
|
29
31
|
private readonly SPLIT_DURATION;
|
|
30
32
|
private attentionQuality;
|
|
33
|
+
private snapshotCaptured;
|
|
34
|
+
private snapshotEnabled;
|
|
35
|
+
private deviceType;
|
|
31
36
|
constructor(tracker: HeatmapTracker, options?: Partial<HeatmapTrackingOptions>);
|
|
32
37
|
/**
|
|
33
38
|
* Initialize heatmap tracking
|
|
34
39
|
*/
|
|
35
40
|
private initialize;
|
|
41
|
+
/**
|
|
42
|
+
* Check remote config for snapshot capture enablement
|
|
43
|
+
*/
|
|
44
|
+
/**
|
|
45
|
+
* Detect device type based on viewport width and user agent
|
|
46
|
+
* Mobile: width < 768px OR mobile user agent
|
|
47
|
+
* Desktop: width >= 768px AND non-mobile user agent
|
|
48
|
+
*/
|
|
49
|
+
private detectDeviceType;
|
|
50
|
+
/**
|
|
51
|
+
* Normalize URL by removing query params and hash, and stripping www prefix
|
|
52
|
+
* This ensures heatmap data is aggregated by page, not by URL variations
|
|
53
|
+
* Subdomains (other than www) are preserved: api.example.com != app.example.com
|
|
54
|
+
*/
|
|
55
|
+
private normalizeUrl;
|
|
56
|
+
private checkSnapshotConfig;
|
|
57
|
+
/**
|
|
58
|
+
* Capture DOM snapshot using rrweb-snapshot
|
|
59
|
+
*/
|
|
60
|
+
private captureSnapshot;
|
|
61
|
+
/**
|
|
62
|
+
* Upload snapshot to backend
|
|
63
|
+
*/
|
|
64
|
+
private uploadSnapshot;
|
|
65
|
+
/**
|
|
66
|
+
* Get API URL from tracker configuration
|
|
67
|
+
*/
|
|
68
|
+
private getApiUrl;
|
|
69
|
+
/**
|
|
70
|
+
* Get tenant ID from tracker configuration
|
|
71
|
+
*/
|
|
72
|
+
private getTenantId;
|
|
73
|
+
/**
|
|
74
|
+
* Get auth headers from tracker
|
|
75
|
+
*/
|
|
76
|
+
private getAuthHeaders;
|
|
36
77
|
/**
|
|
37
78
|
* Setup click event tracking
|
|
38
79
|
*/
|
|
@@ -65,6 +106,10 @@ export declare class HeatmapTrackingManager {
|
|
|
65
106
|
* Update current scroll state
|
|
66
107
|
*/
|
|
67
108
|
private updateScrollState;
|
|
109
|
+
/**
|
|
110
|
+
* Generate CSS selector for an element (for element-relative positioning)
|
|
111
|
+
*/
|
|
112
|
+
private generateCSSSelector;
|
|
68
113
|
/**
|
|
69
114
|
* Generate XPath for an element
|
|
70
115
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"heatmap-tracking.d.ts","sourceRoot":"","sources":["../../src/heatmap-tracking.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAGV,sBAAsB,EAEvB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5H,UAAU,CAAC,QAAQ,EAAE,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;IACxE,mBAAmB,IAAI,gBAAgB,CAAC;IACxC,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAC/B;AASD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,cAAc,CAA2B;IAGjD,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,mBAAmB,CAAuB;IAGlD,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IAGvC,OAAO,CAAC,gBAAgB,CAA0B;
|
|
1
|
+
{"version":3,"file":"heatmap-tracking.d.ts","sourceRoot":"","sources":["../../src/heatmap-tracking.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAGV,sBAAsB,EAEvB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5H,UAAU,CAAC,QAAQ,EAAE,WAAW,GAAG,WAAW,GAAG,YAAY,GAAG,OAAO,CAAC;IACxE,mBAAmB,IAAI,gBAAgB,CAAC;IACxC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACzD,kBAAkB,IAAI,MAAM,CAAC;IAC7B,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAC/B;AASD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,WAAW,CAAS;IAG5B,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,aAAa,CAA0B;IAC/C,OAAO,CAAC,cAAc,CAA2B;IAGjD,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,mBAAmB,CAAuB;IAClD,OAAO,CAAC,mBAAmB,CAAuB;IAGlD,OAAO,CAAC,kBAAkB,CAAK;IAC/B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IAGvC,OAAO,CAAC,gBAAgB,CAA0B;IAGlD,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,eAAe,CAAS;IAGhC,OAAO,CAAC,UAAU,CAAmC;gBAGnD,OAAO,EAAE,cAAc,EACvB,OAAO,GAAE,OAAO,CAAC,sBAAsB,CAAM;IA6B/C;;OAEG;YACW,UAAU;IA0BxB;;OAEG;IACH;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IA6BxB;;;;OAIG;IACH,OAAO,CAAC,YAAY;YAkBN,mBAAmB;IAWjC;;OAEG;YACW,eAAe;IA6B7B;;OAEG;YACW,cAAc;IA0D5B;;OAEG;YACW,SAAS;IAQvB;;OAEG;YACW,WAAW;IAQzB;;OAEG;YACW,cAAc;IAW5B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;OAEG;IACH,OAAO,CAAC,2BAA2B;IA2EnC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmC1B;;OAEG;IACH,OAAO,CAAC,WAAW;IAiFnB;;OAEG;IACH,OAAO,CAAC,YAAY;IAMpB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAuDzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkD3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAiCrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAkB1B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsD1B;;OAEG;IACH,OAAO,CAAC,4BAA4B;IA+CpC;;OAEG;IACH,OAAO,CAAC,GAAG;IAMX;;OAEG;IACH,OAAO,IAAI,IAAI;CA8BhB"}
|
|
@@ -26,8 +26,15 @@ export class HeatmapTrackingManager {
|
|
|
26
26
|
this.lastScrollPosition = 0;
|
|
27
27
|
this.lastScrollTime = Date.now();
|
|
28
28
|
this.SPLIT_DURATION = 3000; // 3 seconds - same as section tracking
|
|
29
|
+
// Snapshot capture state
|
|
30
|
+
this.snapshotCaptured = false;
|
|
31
|
+
this.snapshotEnabled = false;
|
|
32
|
+
// Device type detection
|
|
33
|
+
this.deviceType = 'desktop';
|
|
29
34
|
this.tracker = tracker;
|
|
30
35
|
this.options = { ...DEFAULT_OPTIONS, ...options };
|
|
36
|
+
// Detect device type on initialization
|
|
37
|
+
this.deviceType = this.detectDeviceType();
|
|
31
38
|
// Initialize attention quality manager
|
|
32
39
|
this.attentionQuality = new AttentionQualityManager(tracker.getActivityDetector(), {
|
|
33
40
|
maxSectionDuration: 9000, // 9 seconds per viewport section
|
|
@@ -48,10 +55,12 @@ export class HeatmapTrackingManager {
|
|
|
48
55
|
/**
|
|
49
56
|
* Initialize heatmap tracking
|
|
50
57
|
*/
|
|
51
|
-
initialize() {
|
|
58
|
+
async initialize() {
|
|
52
59
|
if (this.isDestroyed)
|
|
53
60
|
return;
|
|
54
61
|
this.log('Initializing heatmap tracking');
|
|
62
|
+
// Check remote config for snapshot capture
|
|
63
|
+
await this.checkSnapshotConfig();
|
|
55
64
|
// Setup click tracking
|
|
56
65
|
this.setupClickTracking();
|
|
57
66
|
// Setup scroll tracking
|
|
@@ -60,6 +69,187 @@ export class HeatmapTrackingManager {
|
|
|
60
69
|
this.startScrollTracking();
|
|
61
70
|
// Setup page unload handler for beaconing
|
|
62
71
|
this.setupUnloadHandler();
|
|
72
|
+
// Initialize snapshot capture if enabled
|
|
73
|
+
if (this.snapshotEnabled && !this.snapshotCaptured) {
|
|
74
|
+
this.captureSnapshot();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Check remote config for snapshot capture enablement
|
|
79
|
+
*/
|
|
80
|
+
/**
|
|
81
|
+
* Detect device type based on viewport width and user agent
|
|
82
|
+
* Mobile: width < 768px OR mobile user agent
|
|
83
|
+
* Desktop: width >= 768px AND non-mobile user agent
|
|
84
|
+
*/
|
|
85
|
+
detectDeviceType() {
|
|
86
|
+
if (typeof window === 'undefined' || typeof navigator === 'undefined') {
|
|
87
|
+
return 'desktop'; // SSR default
|
|
88
|
+
}
|
|
89
|
+
// Check viewport width
|
|
90
|
+
const width = window.innerWidth || window.screen?.width || 0;
|
|
91
|
+
const isMobileWidth = width < 768;
|
|
92
|
+
// Check user agent for mobile indicators
|
|
93
|
+
const userAgent = navigator.userAgent.toLowerCase();
|
|
94
|
+
const mobileKeywords = [
|
|
95
|
+
'mobile',
|
|
96
|
+
'android',
|
|
97
|
+
'iphone',
|
|
98
|
+
'ipad',
|
|
99
|
+
'ipod',
|
|
100
|
+
'blackberry',
|
|
101
|
+
'windows phone',
|
|
102
|
+
'webos',
|
|
103
|
+
];
|
|
104
|
+
const isMobileUserAgent = mobileKeywords.some((keyword) => userAgent.includes(keyword));
|
|
105
|
+
// Device is mobile if either width OR user agent indicates mobile
|
|
106
|
+
return isMobileWidth || isMobileUserAgent ? 'mobile' : 'desktop';
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Normalize URL by removing query params and hash, and stripping www prefix
|
|
110
|
+
* This ensures heatmap data is aggregated by page, not by URL variations
|
|
111
|
+
* Subdomains (other than www) are preserved: api.example.com != app.example.com
|
|
112
|
+
*/
|
|
113
|
+
normalizeUrl(url) {
|
|
114
|
+
try {
|
|
115
|
+
const urlObj = new URL(url);
|
|
116
|
+
let hostname = urlObj.hostname.toLowerCase();
|
|
117
|
+
// Strip www prefix but keep other subdomains
|
|
118
|
+
if (hostname.startsWith('www.')) {
|
|
119
|
+
hostname = hostname.substring(4);
|
|
120
|
+
}
|
|
121
|
+
// Return protocol + normalized hostname + pathname only
|
|
122
|
+
return `${urlObj.protocol}//${hostname}${urlObj.pathname}`;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// If URL parsing fails, return as-is
|
|
126
|
+
return url;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async checkSnapshotConfig() {
|
|
130
|
+
try {
|
|
131
|
+
const enableSnapshot = await this.tracker.getConfigAsync('enableHeatmapSnapshot');
|
|
132
|
+
this.snapshotEnabled = enableSnapshot === 'true';
|
|
133
|
+
this.log('Heatmap snapshot capture enabled:', this.snapshotEnabled);
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
this.log('Failed to check snapshot config, defaulting to disabled:', error);
|
|
137
|
+
this.snapshotEnabled = false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Capture DOM snapshot using rrweb-snapshot
|
|
142
|
+
*/
|
|
143
|
+
async captureSnapshot() {
|
|
144
|
+
if (this.snapshotCaptured || !this.snapshotEnabled)
|
|
145
|
+
return;
|
|
146
|
+
try {
|
|
147
|
+
this.log('Capturing DOM snapshot...');
|
|
148
|
+
// Dynamically import rrweb-snapshot (only if enabled)
|
|
149
|
+
// @ts-ignore - rrweb-snapshot is an optional dependency, may not be resolvable during React build
|
|
150
|
+
const rrwebSnapshot = await import('rrweb-snapshot');
|
|
151
|
+
// Capture full DOM snapshot with PII masking
|
|
152
|
+
const snapshot = rrwebSnapshot.snapshot(document, {
|
|
153
|
+
maskAllInputs: true,
|
|
154
|
+
maskTextFn: (text) => {
|
|
155
|
+
// Basic PII masking - mask anything that looks like email or sensitive data
|
|
156
|
+
return text.replace(/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g, '*****');
|
|
157
|
+
},
|
|
158
|
+
});
|
|
159
|
+
this.snapshotCaptured = true;
|
|
160
|
+
this.log('DOM snapshot captured successfully');
|
|
161
|
+
// Upload snapshot to backend
|
|
162
|
+
await this.uploadSnapshot(snapshot);
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
this.log('Failed to capture DOM snapshot:', error);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Upload snapshot to backend
|
|
170
|
+
*/
|
|
171
|
+
async uploadSnapshot(snapshot) {
|
|
172
|
+
try {
|
|
173
|
+
const sessionId = this.tracker.getEffectiveUserId();
|
|
174
|
+
const pageUrl = this.normalizeUrl(window.location.href);
|
|
175
|
+
this.log('Uploading snapshot to backend - sessionId:', sessionId);
|
|
176
|
+
// Note: The actual API call would need the tenantId from the tracker
|
|
177
|
+
// For now, we'll log that the snapshot is ready to be uploaded
|
|
178
|
+
// The tracker would need to expose tenantId for this to work
|
|
179
|
+
const snapshotData = {
|
|
180
|
+
sessionId,
|
|
181
|
+
pageUrl,
|
|
182
|
+
snapshot
|
|
183
|
+
};
|
|
184
|
+
this.log('Snapshot data prepared:', { sessionId, pageUrl, snapshotSize: JSON.stringify(snapshot).length });
|
|
185
|
+
// Get API configuration from tracker
|
|
186
|
+
const apiUrl = await this.getApiUrl();
|
|
187
|
+
const tenantId = await this.getTenantId();
|
|
188
|
+
const headers = await this.getAuthHeaders();
|
|
189
|
+
if (!apiUrl || !tenantId) {
|
|
190
|
+
this.log('Cannot upload snapshot: missing API URL or tenant ID');
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
// Upload to backend
|
|
194
|
+
const response = await fetch(`${apiUrl}/v1/events/${encodeURIComponent(tenantId)}/snapshot`, {
|
|
195
|
+
method: 'POST',
|
|
196
|
+
headers: {
|
|
197
|
+
'Content-Type': 'application/json',
|
|
198
|
+
...headers
|
|
199
|
+
},
|
|
200
|
+
body: JSON.stringify({
|
|
201
|
+
sessionId,
|
|
202
|
+
pageUrl,
|
|
203
|
+
snapshot: JSON.stringify(snapshot),
|
|
204
|
+
timestamp: Date.now(),
|
|
205
|
+
deviceType: this.deviceType
|
|
206
|
+
})
|
|
207
|
+
});
|
|
208
|
+
if (!response.ok) {
|
|
209
|
+
throw new Error(`Snapshot upload failed: ${response.status}`);
|
|
210
|
+
}
|
|
211
|
+
const result = await response.json();
|
|
212
|
+
this.log('Snapshot uploaded successfully:', result);
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
this.log('Failed to upload snapshot:', error);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Get API URL from tracker configuration
|
|
220
|
+
*/
|
|
221
|
+
async getApiUrl() {
|
|
222
|
+
try {
|
|
223
|
+
return this.tracker.config?.apiUrl || 'https://api.grainql.com';
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
return 'https://api.grainql.com';
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get tenant ID from tracker configuration
|
|
231
|
+
*/
|
|
232
|
+
async getTenantId() {
|
|
233
|
+
try {
|
|
234
|
+
return this.tracker.config?.tenantId;
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
return undefined;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Get auth headers from tracker
|
|
242
|
+
*/
|
|
243
|
+
async getAuthHeaders() {
|
|
244
|
+
try {
|
|
245
|
+
if (typeof this.tracker.getAuthHeaders === 'function') {
|
|
246
|
+
return await this.tracker.getAuthHeaders();
|
|
247
|
+
}
|
|
248
|
+
return {};
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return {};
|
|
252
|
+
}
|
|
63
253
|
}
|
|
64
254
|
/**
|
|
65
255
|
* Setup click event tracking
|
|
@@ -148,7 +338,7 @@ export class HeatmapTrackingManager {
|
|
|
148
338
|
return;
|
|
149
339
|
}
|
|
150
340
|
const scrollData = {
|
|
151
|
-
pageUrl: window.location.href,
|
|
341
|
+
pageUrl: this.normalizeUrl(window.location.href),
|
|
152
342
|
viewportSection: this.currentScrollState.viewportSection,
|
|
153
343
|
scrollDepthPx: scrollY,
|
|
154
344
|
durationMs: duration,
|
|
@@ -156,6 +346,7 @@ export class HeatmapTrackingManager {
|
|
|
156
346
|
exitTimestamp: currentTime,
|
|
157
347
|
pageHeight,
|
|
158
348
|
viewportHeight,
|
|
349
|
+
deviceType: this.deviceType,
|
|
159
350
|
};
|
|
160
351
|
// Send immediately using beacon to ensure delivery
|
|
161
352
|
this.tracker.trackSystemEvent('_grain_heatmap_scroll', {
|
|
@@ -167,6 +358,7 @@ export class HeatmapTrackingManager {
|
|
|
167
358
|
exit_timestamp: scrollData.exitTimestamp,
|
|
168
359
|
page_height: scrollData.pageHeight,
|
|
169
360
|
viewport_height: scrollData.viewportHeight,
|
|
361
|
+
device_type: scrollData.deviceType,
|
|
170
362
|
is_split: true, // Flag to indicate periodic tracking, not final exit
|
|
171
363
|
}, { flush: true });
|
|
172
364
|
// Update attention quality duration tracker
|
|
@@ -189,7 +381,7 @@ export class HeatmapTrackingManager {
|
|
|
189
381
|
const duration = currentTime - this.currentScrollState.entryTime;
|
|
190
382
|
if (duration > 100) {
|
|
191
383
|
const scrollData = {
|
|
192
|
-
pageUrl: window.location.href,
|
|
384
|
+
pageUrl: this.normalizeUrl(window.location.href),
|
|
193
385
|
viewportSection: this.currentScrollState.viewportSection,
|
|
194
386
|
scrollDepthPx: this.currentScrollState.scrollDepthPx,
|
|
195
387
|
durationMs: duration,
|
|
@@ -197,6 +389,7 @@ export class HeatmapTrackingManager {
|
|
|
197
389
|
exitTimestamp: currentTime,
|
|
198
390
|
pageHeight: document.documentElement.scrollHeight,
|
|
199
391
|
viewportHeight: window.innerHeight,
|
|
392
|
+
deviceType: this.deviceType,
|
|
200
393
|
};
|
|
201
394
|
this.pendingScrolls.push(scrollData);
|
|
202
395
|
}
|
|
@@ -217,8 +410,23 @@ export class HeatmapTrackingManager {
|
|
|
217
410
|
const element = event.target;
|
|
218
411
|
if (!element)
|
|
219
412
|
return;
|
|
220
|
-
const pageUrl = window.location.href;
|
|
413
|
+
const pageUrl = this.normalizeUrl(window.location.href);
|
|
221
414
|
const xpath = this.generateXPath(element);
|
|
415
|
+
// Generate CSS selector for element-relative positioning
|
|
416
|
+
const selector = this.generateCSSSelector(element);
|
|
417
|
+
// Calculate element-relative coordinates
|
|
418
|
+
let relX;
|
|
419
|
+
let relY;
|
|
420
|
+
try {
|
|
421
|
+
const rect = element.getBoundingClientRect();
|
|
422
|
+
if (rect.width > 0 && rect.height > 0) {
|
|
423
|
+
relX = Math.max(0, Math.min(1, (event.clientX - rect.left) / rect.width));
|
|
424
|
+
relY = Math.max(0, Math.min(1, (event.clientY - rect.top) / rect.height));
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
catch (error) {
|
|
428
|
+
this.log('Failed to calculate relative coordinates:', error);
|
|
429
|
+
}
|
|
222
430
|
// Get viewport coordinates
|
|
223
431
|
const viewportX = Math.round(event.clientX);
|
|
224
432
|
const viewportY = Math.round(event.clientY);
|
|
@@ -230,6 +438,9 @@ export class HeatmapTrackingManager {
|
|
|
230
438
|
const clickData = {
|
|
231
439
|
pageUrl,
|
|
232
440
|
xpath,
|
|
441
|
+
selector,
|
|
442
|
+
relX,
|
|
443
|
+
relY,
|
|
233
444
|
viewportX,
|
|
234
445
|
viewportY,
|
|
235
446
|
pageX,
|
|
@@ -237,6 +448,7 @@ export class HeatmapTrackingManager {
|
|
|
237
448
|
elementTag,
|
|
238
449
|
elementText: elementText || undefined,
|
|
239
450
|
timestamp: Date.now(),
|
|
451
|
+
deviceType: this.deviceType,
|
|
240
452
|
};
|
|
241
453
|
// Check if this is a navigation link
|
|
242
454
|
const isNavigationLink = element instanceof HTMLAnchorElement && element.href;
|
|
@@ -245,6 +457,9 @@ export class HeatmapTrackingManager {
|
|
|
245
457
|
this.tracker.trackSystemEvent('_grain_heatmap_click', {
|
|
246
458
|
page_url: clickData.pageUrl,
|
|
247
459
|
xpath: clickData.xpath,
|
|
460
|
+
selector: clickData.selector,
|
|
461
|
+
rel_x: clickData.relX,
|
|
462
|
+
rel_y: clickData.relY,
|
|
248
463
|
viewport_x: clickData.viewportX,
|
|
249
464
|
viewport_y: clickData.viewportY,
|
|
250
465
|
page_x: clickData.pageX,
|
|
@@ -252,6 +467,7 @@ export class HeatmapTrackingManager {
|
|
|
252
467
|
element_tag: clickData.elementTag,
|
|
253
468
|
element_text: clickData.elementText,
|
|
254
469
|
timestamp: clickData.timestamp,
|
|
470
|
+
device_type: clickData.deviceType,
|
|
255
471
|
}, { flush: true });
|
|
256
472
|
}
|
|
257
473
|
else {
|
|
@@ -288,7 +504,7 @@ export class HeatmapTrackingManager {
|
|
|
288
504
|
// Only record if duration is meaningful (> 100ms)
|
|
289
505
|
if (duration > 100) {
|
|
290
506
|
const scrollData = {
|
|
291
|
-
pageUrl: window.location.href,
|
|
507
|
+
pageUrl: this.normalizeUrl(window.location.href),
|
|
292
508
|
viewportSection: this.currentScrollState.viewportSection,
|
|
293
509
|
scrollDepthPx: this.currentScrollState.scrollDepthPx,
|
|
294
510
|
durationMs: duration,
|
|
@@ -296,6 +512,7 @@ export class HeatmapTrackingManager {
|
|
|
296
512
|
exitTimestamp: currentTime,
|
|
297
513
|
pageHeight,
|
|
298
514
|
viewportHeight,
|
|
515
|
+
deviceType: this.deviceType,
|
|
299
516
|
};
|
|
300
517
|
this.pendingScrolls.push(scrollData);
|
|
301
518
|
}
|
|
@@ -316,6 +533,50 @@ export class HeatmapTrackingManager {
|
|
|
316
533
|
// Check if we should flush
|
|
317
534
|
this.considerBatchFlush();
|
|
318
535
|
}
|
|
536
|
+
/**
|
|
537
|
+
* Generate CSS selector for an element (for element-relative positioning)
|
|
538
|
+
*/
|
|
539
|
+
generateCSSSelector(element) {
|
|
540
|
+
if (!element)
|
|
541
|
+
return '';
|
|
542
|
+
// Prefer ID if available
|
|
543
|
+
if (element.id) {
|
|
544
|
+
return `#${element.id}`;
|
|
545
|
+
}
|
|
546
|
+
// Try data attributes
|
|
547
|
+
const dataAttrs = Array.from(element.attributes).filter(attr => attr.name.startsWith('data-'));
|
|
548
|
+
if (dataAttrs.length > 0) {
|
|
549
|
+
const attr = dataAttrs[0];
|
|
550
|
+
return `${element.tagName.toLowerCase()}[${attr.name}="${attr.value}"]`;
|
|
551
|
+
}
|
|
552
|
+
// Try class names (pick first meaningful class)
|
|
553
|
+
if (element.className && typeof element.className === 'string') {
|
|
554
|
+
const classes = element.className.split(' ').filter(c => c && !c.match(/^(active|hover|focus)/));
|
|
555
|
+
if (classes.length > 0) {
|
|
556
|
+
return `${element.tagName.toLowerCase()}.${classes[0]}`;
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
// Fall back to nth-child path
|
|
560
|
+
const path = [];
|
|
561
|
+
let current = element;
|
|
562
|
+
while (current && current !== document.body) {
|
|
563
|
+
let selector = current.tagName.toLowerCase();
|
|
564
|
+
if (current.parentElement) {
|
|
565
|
+
const siblings = Array.from(current.parentElement.children);
|
|
566
|
+
const sameTagSiblings = siblings.filter(s => s.tagName === current.tagName);
|
|
567
|
+
if (sameTagSiblings.length > 1) {
|
|
568
|
+
const index = sameTagSiblings.indexOf(current) + 1;
|
|
569
|
+
selector += `:nth-child(${index})`;
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
path.unshift(selector);
|
|
573
|
+
current = current.parentElement;
|
|
574
|
+
// Limit path depth to avoid overly long selectors
|
|
575
|
+
if (path.length >= 5)
|
|
576
|
+
break;
|
|
577
|
+
}
|
|
578
|
+
return path.join(' > ');
|
|
579
|
+
}
|
|
319
580
|
/**
|
|
320
581
|
* Generate XPath for an element
|
|
321
582
|
*/
|
|
@@ -377,6 +638,9 @@ export class HeatmapTrackingManager {
|
|
|
377
638
|
this.tracker.trackSystemEvent('_grain_heatmap_click', {
|
|
378
639
|
page_url: clickData.pageUrl,
|
|
379
640
|
xpath: clickData.xpath,
|
|
641
|
+
selector: clickData.selector,
|
|
642
|
+
rel_x: clickData.relX,
|
|
643
|
+
rel_y: clickData.relY,
|
|
380
644
|
viewport_x: clickData.viewportX,
|
|
381
645
|
viewport_y: clickData.viewportY,
|
|
382
646
|
page_x: clickData.pageX,
|
|
@@ -384,6 +648,7 @@ export class HeatmapTrackingManager {
|
|
|
384
648
|
element_tag: clickData.elementTag,
|
|
385
649
|
element_text: clickData.elementText,
|
|
386
650
|
timestamp: clickData.timestamp,
|
|
651
|
+
device_type: clickData.deviceType,
|
|
387
652
|
});
|
|
388
653
|
}
|
|
389
654
|
this.pendingClicks = [];
|
|
@@ -400,6 +665,7 @@ export class HeatmapTrackingManager {
|
|
|
400
665
|
exit_timestamp: scrollData.exitTimestamp,
|
|
401
666
|
page_height: scrollData.pageHeight,
|
|
402
667
|
viewport_height: scrollData.viewportHeight,
|
|
668
|
+
device_type: scrollData.deviceType,
|
|
403
669
|
});
|
|
404
670
|
}
|
|
405
671
|
this.pendingScrolls = [];
|
|
@@ -422,6 +688,9 @@ export class HeatmapTrackingManager {
|
|
|
422
688
|
this.tracker.trackSystemEvent('_grain_heatmap_click', {
|
|
423
689
|
page_url: clickData.pageUrl,
|
|
424
690
|
xpath: clickData.xpath,
|
|
691
|
+
selector: clickData.selector,
|
|
692
|
+
rel_x: clickData.relX,
|
|
693
|
+
rel_y: clickData.relY,
|
|
425
694
|
viewport_x: clickData.viewportX,
|
|
426
695
|
viewport_y: clickData.viewportY,
|
|
427
696
|
page_x: clickData.pageX,
|
|
@@ -429,6 +698,7 @@ export class HeatmapTrackingManager {
|
|
|
429
698
|
element_tag: clickData.elementTag,
|
|
430
699
|
element_text: clickData.elementText,
|
|
431
700
|
timestamp: clickData.timestamp,
|
|
701
|
+
device_type: clickData.deviceType,
|
|
432
702
|
}, { flush: true });
|
|
433
703
|
}
|
|
434
704
|
this.pendingClicks = [];
|
|
@@ -445,6 +715,7 @@ export class HeatmapTrackingManager {
|
|
|
445
715
|
exit_timestamp: scrollData.exitTimestamp,
|
|
446
716
|
page_height: scrollData.pageHeight,
|
|
447
717
|
viewport_height: scrollData.viewportHeight,
|
|
718
|
+
device_type: scrollData.deviceType,
|
|
448
719
|
}, { flush: true });
|
|
449
720
|
}
|
|
450
721
|
this.pendingScrolls = [];
|