react-tag-tracker 0.1.4 → 0.1.5
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 +2 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -119
- package/dist/index.js.map +3 -3
- package/dist/types.d.ts +1 -1
- package/package.json +31 -26
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var u=Object.defineProperty;var b=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var P=Object.prototype.hasOwnProperty;var C=(r,a)=>{for(var t in a)u(r,t,{get:a[t],enumerable:!0})},x=(r,a,t,s)=>{if(a&&typeof a=="object"||typeof a=="function")for(let n of D(a))!P.call(r,n)&&n!==t&&u(r,n,{get:()=>a[n],enumerable:!(s=b(a,n))||s.enumerable});return r};var H=r=>x(u({},"__esModule",{value:!0}),r);var M={};C(M,{TagTrackerProvider:()=>w,useTagTracker:()=>g});module.exports=H(M);var y=require("react");var v=require("react"),f=(0,v.createContext)(null),g=()=>{let r=(0,v.useContext)(f);if(!r)throw new Error("useTagTracker must be used within a TagTrackerProvider");return r},E=f;var L=require("react/jsx-runtime"),A=r=>{let{children:a,trackingAttribute:t="data-track",enableHoverTracking:s=!1,enableVisibilityTracking:n=!1,enableCustomTracking:p=!0}=r,l=i=>{try{window.dataLayer=window.dataLayer||[],window.dataLayer.push(i)}catch(e){}},m=i=>{let e=i.target;for(;e&&!e.hasAttribute(t);)e=e.parentElement;if(e){let c=e.getAttribute(t);try{let o=JSON.parse(c||"{}");if(["hover","visibility"].includes(o.eventTracker))return;if(!o.eventTracker)throw new Error("Event property is required");l(o)}catch(o){}}},k=i=>{if(s){let e=i.target;for(;e&&!e.hasAttribute(t);)e=e.parentElement;if(e){let c=e.getAttribute(t);try{let o=JSON.parse(c||"{}");if(o.eventTracker!=="hover")return;l(o)}catch(o){}}}},d=()=>{n&&document.querySelectorAll(`[${t}]`).forEach(e=>{let c=e.getAttribute(t),o=e.getBoundingClientRect();if(o.top>=0&&o.bottom<=window.innerHeight)try{let T=JSON.parse(c||"{}");if(T.eventTracker!=="visibility")return;l(T),window.removeEventListener("scroll",d)}catch(T){}})},h=i=>{if(p){if(typeof i!="object")return;l(i)}};return(0,y.useEffect)(()=>(document.addEventListener("click",m),s&&document.addEventListener("mouseover",k),n&&window.addEventListener("scroll",d),()=>{document.removeEventListener("click",m),s&&document.removeEventListener("mouseover",k),n&&window.removeEventListener("scroll",d)}),[t,s,n,p]),(0,L.jsx)(E.Provider,{value:{trackCustomEvent:h},children:a})},w=A;
|
|
2
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../src/TagTrackerProvider.tsx", "../src/TagTrackerContext.tsx"],
|
|
4
|
+
"sourcesContent": ["export { default as TagTrackerProvider } from './TagTrackerProvider';\nexport { useTagTracker } from './TagTrackerContext';\n\nexport type { DataLayerEventProps, TagTrackerProviderProps } from './types';\n", "import { useEffect } from 'react';\nimport TagTrackerContext from './TagTrackerContext';\nimport { DataLayerEventProps, TagTrackerProviderProps } from './types';\n\nconst TagTrackerProvider = (props: TagTrackerProviderProps) => {\n const {\n children,\n trackingAttribute = 'data-track',\n enableHoverTracking = false,\n enableVisibilityTracking = false,\n enableCustomTracking = true,\n } = props;\n\n const pushToDataLayer = (data: DataLayerEventProps) => {\n try {\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(data);\n } catch (error) {\n console.warn('Failed to push to dataLayer:', error);\n }\n }\n\n const handleEvent = (event: MouseEvent): void => {\n let element = event.target as HTMLElement;\n\n while (element && !element.hasAttribute(trackingAttribute)) {\n element = element.parentElement as HTMLElement;\n }\n\n if (element) {\n const trackData = element.getAttribute(trackingAttribute);\n\n try {\n const parsedData: DataLayerEventProps = JSON.parse(trackData || '{}');\n\n if (['hover', 'visibility'].includes(parsedData.eventTracker)) return;\n if (!parsedData.eventTracker) throw new Error('Event property is required');\n\n pushToDataLayer(parsedData);\n console.log('[TagTracker] Event:', parsedData);\n } catch (error) {\n console.warn('Click event failed:', error);\n }\n }\n };\n\n const handleHoverTracking = (event: MouseEvent): void => {\n if (enableHoverTracking) {\n let element = event.target as HTMLElement;\n\n while (element && !element.hasAttribute(trackingAttribute)) {\n element = element.parentElement as HTMLElement;\n }\n if (element) {\n const trackData = element.getAttribute(trackingAttribute);\n\n try {\n const parsedData: DataLayerEventProps = JSON.parse(trackData || '{}');\n\n if (parsedData.eventTracker !== 'hover') return;\n\n pushToDataLayer(parsedData);\n console.log('[TagTracker] Hover Event:', parsedData);\n } catch (error) {\n console.warn('Hover event failed:', error);\n }\n }\n }\n };\n\n const handleVisibilityTracking = () => {\n if (enableVisibilityTracking) {\n const elements = document.querySelectorAll(`[${trackingAttribute}]`);\n\n elements.forEach((element) => {\n const trackData = element.getAttribute(trackingAttribute);\n const rect = element.getBoundingClientRect();\n\n if (rect.top >= 0 && rect.bottom <= window.innerHeight) {\n try {\n const parsedData = JSON.parse(trackData || '{}');\n\n if (parsedData.eventTracker !== 'visibility') return;\n\n pushToDataLayer(parsedData);\n console.log('[TagTracker] Visibility Event:', parsedData);\n window.removeEventListener('scroll', handleVisibilityTracking);\n } catch (error) {\n console.warn('Visibility tracking failed:', error);\n }\n }\n });\n }\n };\n\n const trackCustomEvent = (eventData: DataLayerEventProps) => {\n if (enableCustomTracking) {\n if (typeof eventData !== 'object') {\n console.warn('trackCustomEvent requires an object parameter');\n return;\n }\n\n pushToDataLayer(eventData);\n console.log('[TagTracker] Custom Event:', eventData);\n }\n };\n\n useEffect(() => {\n document.addEventListener('click', handleEvent);\n\n if (enableHoverTracking) {\n document.addEventListener('mouseover', handleHoverTracking);\n }\n\n if (enableVisibilityTracking) {\n window.addEventListener('scroll', handleVisibilityTracking);\n }\n\n return () => {\n document.removeEventListener('click', handleEvent);\n\n if (enableHoverTracking) {\n document.removeEventListener('mouseover', handleHoverTracking);\n }\n\n if (enableVisibilityTracking) {\n window.removeEventListener('scroll', handleVisibilityTracking);\n }\n };\n }, [trackingAttribute, enableHoverTracking, enableVisibilityTracking, enableCustomTracking]);\n\n return (\n <TagTrackerContext.Provider value={{ trackCustomEvent }}>{children}</TagTrackerContext.Provider>\n );\n};\n\nexport default TagTrackerProvider;\n", "import { createContext, useContext } from 'react';\nimport { DataLayerEventProps } from './types';\n\ninterface TagTrackerContextType {\n trackCustomEvent: (eventData: DataLayerEventProps) => void;\n}\n\nconst TagTrackerContext = createContext<TagTrackerContextType | null>(null);\n\nexport const useTagTracker = () => {\n const context = useContext(TagTrackerContext);\n\n if (!context) throw new Error('useTagTracker must be used within a TagTrackerProvider');\n return context;\n};\n\nexport default TagTrackerContext;\n"],
|
|
5
|
+
"mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,EAAA,kBAAAC,IAAA,eAAAC,EAAAJ,GCAA,IAAAK,EAA0B,iBCA1B,IAAAC,EAA0C,iBAOpCC,KAAoB,iBAA4C,IAAI,EAE7DC,EAAgB,IAAM,CACjC,IAAMC,KAAU,cAAWF,CAAiB,EAE5C,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,wDAAwD,EACtF,OAAOA,CACT,EAEOC,EAAQH,EDoHX,IAAAI,EAAA,6BAhIEC,EAAsBC,GAAmC,CAC7D,GAAM,CACJ,SAAAC,EACA,kBAAAC,EAAoB,aACpB,oBAAAC,EAAsB,GACtB,yBAAAC,EAA2B,GAC3B,qBAAAC,EAAuB,EACzB,EAAIL,EAEEM,EAAmBC,GAA8B,CACrD,GAAI,CACF,OAAO,UAAY,OAAO,WAAa,CAAC,EACxC,OAAO,UAAU,KAAKA,CAAI,CAC5B,OAASC,EAAO,CAEhB,CACF,EAEMC,EAAeC,GAA4B,CAC/C,IAAIC,EAAUD,EAAM,OAEpB,KAAOC,GAAW,CAACA,EAAQ,aAAaT,CAAiB,GACvDS,EAAUA,EAAQ,cAGpB,GAAIA,EAAS,CACX,IAAMC,EAAYD,EAAQ,aAAaT,CAAiB,EAExD,GAAI,CACF,IAAMW,EAAkC,KAAK,MAAMD,GAAa,IAAI,EAEpE,GAAI,CAAC,QAAS,YAAY,EAAE,SAASC,EAAW,YAAY,EAAG,OAC/D,GAAI,CAACA,EAAW,aAAc,MAAM,IAAI,MAAM,4BAA4B,EAE1EP,EAAgBO,CAAU,CAE5B,OAASL,EAAO,CAEhB,CACF,CACF,EAEMM,EAAuBJ,GAA4B,CACvD,GAAIP,EAAqB,CACvB,IAAIQ,EAAUD,EAAM,OAEpB,KAAOC,GAAW,CAACA,EAAQ,aAAaT,CAAiB,GACvDS,EAAUA,EAAQ,cAEpB,GAAIA,EAAS,CACX,IAAMC,EAAYD,EAAQ,aAAaT,CAAiB,EAExD,GAAI,CACF,IAAMW,EAAkC,KAAK,MAAMD,GAAa,IAAI,EAEpE,GAAIC,EAAW,eAAiB,QAAS,OAEzCP,EAAgBO,CAAU,CAE5B,OAASL,EAAO,CAEhB,CACF,CACF,CACF,EAEMO,EAA2B,IAAM,CACjCX,GACe,SAAS,iBAAiB,IAAIF,CAAiB,GAAG,EAE1D,QAASS,GAAY,CAC5B,IAAMC,EAAYD,EAAQ,aAAaT,CAAiB,EAClDc,EAAOL,EAAQ,sBAAsB,EAE3C,GAAIK,EAAK,KAAO,GAAKA,EAAK,QAAU,OAAO,YACzC,GAAI,CACF,IAAMH,EAAa,KAAK,MAAMD,GAAa,IAAI,EAE/C,GAAIC,EAAW,eAAiB,aAAc,OAE9CP,EAAgBO,CAAU,EAE1B,OAAO,oBAAoB,SAAUE,CAAwB,CAC/D,OAASP,EAAO,CAEhB,CAEJ,CAAC,CAEL,EAEMS,EAAoBC,GAAmC,CAC3D,GAAIb,EAAsB,CACxB,GAAI,OAAOa,GAAc,SAEvB,OAGFZ,EAAgBY,CAAS,CAE3B,CACF,EAEA,sBAAU,KACR,SAAS,iBAAiB,QAAST,CAAW,EAE1CN,GACF,SAAS,iBAAiB,YAAaW,CAAmB,EAGxDV,GACF,OAAO,iBAAiB,SAAUW,CAAwB,EAGrD,IAAM,CACX,SAAS,oBAAoB,QAASN,CAAW,EAE7CN,GACF,SAAS,oBAAoB,YAAaW,CAAmB,EAG3DV,GACF,OAAO,oBAAoB,SAAUW,CAAwB,CAEjE,GACC,CAACb,EAAmBC,EAAqBC,EAA0BC,CAAoB,CAAC,KAGzF,OAACc,EAAkB,SAAlB,CAA2B,MAAO,CAAE,iBAAAF,CAAiB,EAAI,SAAAhB,EAAS,CAEvE,EAEOmB,EAAQrB",
|
|
6
|
+
"names": ["index_exports", "__export", "TagTrackerProvider_default", "useTagTracker", "__toCommonJS", "import_react", "import_react", "TagTrackerContext", "useTagTracker", "context", "TagTrackerContext_default", "import_jsx_runtime", "TagTrackerProvider", "props", "children", "trackingAttribute", "enableHoverTracking", "enableVisibilityTracking", "enableCustomTracking", "pushToDataLayer", "data", "error", "handleEvent", "event", "element", "trackData", "parsedData", "handleHoverTracking", "handleVisibilityTracking", "rect", "trackCustomEvent", "eventData", "TagTrackerContext_default", "TagTrackerProvider_default"]
|
|
7
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { default as TagTrackerProvider } from './TagTrackerProvider';
|
|
2
2
|
export { useTagTracker } from './TagTrackerContext';
|
|
3
|
-
export type { DataLayerEventProps, TagTrackerProviderProps } from
|
|
3
|
+
export type { DataLayerEventProps, TagTrackerProviderProps } from './types';
|
package/dist/index.js
CHANGED
|
@@ -1,120 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
import { useEffect } from "react";
|
|
3
|
-
|
|
4
|
-
// src/TagTrackerContext.tsx
|
|
5
|
-
import { createContext, useContext } from "react";
|
|
6
|
-
var TagTrackerContext = createContext(null);
|
|
7
|
-
var useTagTracker = () => {
|
|
8
|
-
const context = useContext(TagTrackerContext);
|
|
9
|
-
if (!context) throw new Error("useTagTracker must be used within a TagTrackerProvider");
|
|
10
|
-
return context;
|
|
11
|
-
};
|
|
12
|
-
var TagTrackerContext_default = TagTrackerContext;
|
|
13
|
-
|
|
14
|
-
// src/TagTrackerProvider.tsx
|
|
15
|
-
import { jsx } from "react/jsx-runtime";
|
|
16
|
-
var TagTrackerProvider = (props) => {
|
|
17
|
-
const {
|
|
18
|
-
children,
|
|
19
|
-
trackingAttribute = "data-track",
|
|
20
|
-
enableHoverTracking = false,
|
|
21
|
-
enableVisibilityTracking = false,
|
|
22
|
-
enableCustomTracking = true
|
|
23
|
-
} = props;
|
|
24
|
-
const handleEvent = (event) => {
|
|
25
|
-
let element = event.target;
|
|
26
|
-
while (element && !element.hasAttribute(trackingAttribute)) {
|
|
27
|
-
element = element.parentElement;
|
|
28
|
-
}
|
|
29
|
-
if (element) {
|
|
30
|
-
const trackData = element.getAttribute(trackingAttribute);
|
|
31
|
-
try {
|
|
32
|
-
const parsedData = JSON.parse(trackData || "{}");
|
|
33
|
-
if (["hover", "visibility"].includes(parsedData.event)) return;
|
|
34
|
-
if (!parsedData.event) throw new Error("Event property is required");
|
|
35
|
-
window.dataLayer = window.dataLayer || [];
|
|
36
|
-
window.dataLayer.push(parsedData);
|
|
37
|
-
console.log("[TagTracker] Event:", parsedData);
|
|
38
|
-
} catch (error) {
|
|
39
|
-
console.warn("Click event failed:", error);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
const handleHoverTracking = (event) => {
|
|
44
|
-
if (enableHoverTracking) {
|
|
45
|
-
let element = event.target;
|
|
46
|
-
while (element && !element.hasAttribute(trackingAttribute)) {
|
|
47
|
-
element = element.parentElement;
|
|
48
|
-
}
|
|
49
|
-
if (element) {
|
|
50
|
-
const trackData = element.getAttribute(trackingAttribute);
|
|
51
|
-
try {
|
|
52
|
-
const parsedData = JSON.parse(trackData || "{}");
|
|
53
|
-
if (parsedData.event !== "hover") return;
|
|
54
|
-
window.dataLayer = window.dataLayer || [];
|
|
55
|
-
window.dataLayer.push(parsedData);
|
|
56
|
-
console.log("[TagTracker] Hover Event:", parsedData);
|
|
57
|
-
} catch (error) {
|
|
58
|
-
console.warn("Hover event failed:", error);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
const handleVisibilityTracking = () => {
|
|
64
|
-
if (enableVisibilityTracking) {
|
|
65
|
-
const elements = document.querySelectorAll(`[${trackingAttribute}]`);
|
|
66
|
-
elements.forEach((element) => {
|
|
67
|
-
const trackData = element.getAttribute(trackingAttribute);
|
|
68
|
-
const rect = element.getBoundingClientRect();
|
|
69
|
-
if (rect.top >= 0 && rect.bottom <= window.innerHeight) {
|
|
70
|
-
try {
|
|
71
|
-
const parsedData = JSON.parse(trackData || "{}");
|
|
72
|
-
if (parsedData.event !== "visibility") return;
|
|
73
|
-
window.dataLayer = window.dataLayer || [];
|
|
74
|
-
window.dataLayer.push(parsedData);
|
|
75
|
-
console.log("[TagTracker] Visibility Event:", parsedData);
|
|
76
|
-
window.removeEventListener("scroll", handleVisibilityTracking);
|
|
77
|
-
} catch (error) {
|
|
78
|
-
console.warn("Visibility tracking failed:", error);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
};
|
|
84
|
-
const trackCustomEvent = (eventData) => {
|
|
85
|
-
if (enableCustomTracking) {
|
|
86
|
-
if (typeof eventData !== "object") {
|
|
87
|
-
console.warn("trackCustomEvent requires an object parameter");
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
window.dataLayer = window.dataLayer || [];
|
|
91
|
-
window.dataLayer.push(eventData);
|
|
92
|
-
console.log("[TagTracker] Custom Event:", eventData);
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
useEffect(() => {
|
|
96
|
-
document.addEventListener("click", handleEvent);
|
|
97
|
-
if (enableHoverTracking) {
|
|
98
|
-
document.addEventListener("mouseover", handleHoverTracking);
|
|
99
|
-
}
|
|
100
|
-
if (enableVisibilityTracking) {
|
|
101
|
-
window.addEventListener("scroll", handleVisibilityTracking);
|
|
102
|
-
}
|
|
103
|
-
return () => {
|
|
104
|
-
document.removeEventListener("click", handleEvent);
|
|
105
|
-
if (enableHoverTracking) {
|
|
106
|
-
document.removeEventListener("mouseover", handleHoverTracking);
|
|
107
|
-
}
|
|
108
|
-
if (enableVisibilityTracking) {
|
|
109
|
-
window.removeEventListener("scroll", handleVisibilityTracking);
|
|
110
|
-
}
|
|
111
|
-
};
|
|
112
|
-
}, [trackingAttribute, enableHoverTracking, enableVisibilityTracking, enableCustomTracking]);
|
|
113
|
-
return /* @__PURE__ */ jsx(TagTrackerContext_default.Provider, { value: { trackCustomEvent }, children });
|
|
114
|
-
};
|
|
115
|
-
var TagTrackerProvider_default = TagTrackerProvider;
|
|
116
|
-
export {
|
|
117
|
-
TagTrackerProvider_default as TagTrackerProvider,
|
|
118
|
-
useTagTracker
|
|
119
|
-
};
|
|
1
|
+
import{useEffect as w}from"react";import{createContext as g,useContext as E}from"react";var p=g(null),y=()=>{let n=E(p);if(!n)throw new Error("useTagTracker must be used within a TagTrackerProvider");return n},m=p;import{jsx as b}from"react/jsx-runtime";var L=n=>{let{children:k,trackingAttribute:a="data-track",enableHoverTracking:i=!1,enableVisibilityTracking:s=!1,enableCustomTracking:d=!0}=n,c=t=>{try{window.dataLayer=window.dataLayer||[],window.dataLayer.push(t)}catch(e){}},T=t=>{let e=t.target;for(;e&&!e.hasAttribute(a);)e=e.parentElement;if(e){let o=e.getAttribute(a);try{let r=JSON.parse(o||"{}");if(["hover","visibility"].includes(r.eventTracker))return;if(!r.eventTracker)throw new Error("Event property is required");c(r)}catch(r){}}},u=t=>{if(i){let e=t.target;for(;e&&!e.hasAttribute(a);)e=e.parentElement;if(e){let o=e.getAttribute(a);try{let r=JSON.parse(o||"{}");if(r.eventTracker!=="hover")return;c(r)}catch(r){}}}},l=()=>{s&&document.querySelectorAll(`[${a}]`).forEach(e=>{let o=e.getAttribute(a),r=e.getBoundingClientRect();if(r.top>=0&&r.bottom<=window.innerHeight)try{let v=JSON.parse(o||"{}");if(v.eventTracker!=="visibility")return;c(v),window.removeEventListener("scroll",l)}catch(v){}})},f=t=>{if(d){if(typeof t!="object")return;c(t)}};return w(()=>(document.addEventListener("click",T),i&&document.addEventListener("mouseover",u),s&&window.addEventListener("scroll",l),()=>{document.removeEventListener("click",T),i&&document.removeEventListener("mouseover",u),s&&window.removeEventListener("scroll",l)}),[a,i,s,d]),b(m.Provider,{value:{trackCustomEvent:f},children:k})},h=L;export{h as TagTrackerProvider,y as useTagTracker};
|
|
120
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/TagTrackerProvider.tsx", "../src/TagTrackerContext.tsx"],
|
|
4
|
-
"sourcesContent": ["import { useEffect } from 'react';\nimport TagTrackerContext from './TagTrackerContext';\nimport { DataLayerEventProps, TagTrackerProviderProps } from './types';\n\nconst TagTrackerProvider = (props: TagTrackerProviderProps) => {\n const {\n children,\n trackingAttribute = 'data-track',\n enableHoverTracking = false,\n enableVisibilityTracking = false,\n enableCustomTracking = true,\n } = props;\n\n const handleEvent = (event: MouseEvent): void => {\n let element = event.target as HTMLElement;\n\n while (element && !element.hasAttribute(trackingAttribute)) {\n element = element.parentElement as HTMLElement;\n }\n\n if (element) {\n const trackData = element.getAttribute(trackingAttribute);\n\n try {\n const parsedData: DataLayerEventProps = JSON.parse(trackData || '{}');\n\n if (['hover', 'visibility'].includes(parsedData.
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": []
|
|
4
|
+
"sourcesContent": ["import { useEffect } from 'react';\nimport TagTrackerContext from './TagTrackerContext';\nimport { DataLayerEventProps, TagTrackerProviderProps } from './types';\n\nconst TagTrackerProvider = (props: TagTrackerProviderProps) => {\n const {\n children,\n trackingAttribute = 'data-track',\n enableHoverTracking = false,\n enableVisibilityTracking = false,\n enableCustomTracking = true,\n } = props;\n\n const pushToDataLayer = (data: DataLayerEventProps) => {\n try {\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(data);\n } catch (error) {\n console.warn('Failed to push to dataLayer:', error);\n }\n }\n\n const handleEvent = (event: MouseEvent): void => {\n let element = event.target as HTMLElement;\n\n while (element && !element.hasAttribute(trackingAttribute)) {\n element = element.parentElement as HTMLElement;\n }\n\n if (element) {\n const trackData = element.getAttribute(trackingAttribute);\n\n try {\n const parsedData: DataLayerEventProps = JSON.parse(trackData || '{}');\n\n if (['hover', 'visibility'].includes(parsedData.eventTracker)) return;\n if (!parsedData.eventTracker) throw new Error('Event property is required');\n\n pushToDataLayer(parsedData);\n console.log('[TagTracker] Event:', parsedData);\n } catch (error) {\n console.warn('Click event failed:', error);\n }\n }\n };\n\n const handleHoverTracking = (event: MouseEvent): void => {\n if (enableHoverTracking) {\n let element = event.target as HTMLElement;\n\n while (element && !element.hasAttribute(trackingAttribute)) {\n element = element.parentElement as HTMLElement;\n }\n if (element) {\n const trackData = element.getAttribute(trackingAttribute);\n\n try {\n const parsedData: DataLayerEventProps = JSON.parse(trackData || '{}');\n\n if (parsedData.eventTracker !== 'hover') return;\n\n pushToDataLayer(parsedData);\n console.log('[TagTracker] Hover Event:', parsedData);\n } catch (error) {\n console.warn('Hover event failed:', error);\n }\n }\n }\n };\n\n const handleVisibilityTracking = () => {\n if (enableVisibilityTracking) {\n const elements = document.querySelectorAll(`[${trackingAttribute}]`);\n\n elements.forEach((element) => {\n const trackData = element.getAttribute(trackingAttribute);\n const rect = element.getBoundingClientRect();\n\n if (rect.top >= 0 && rect.bottom <= window.innerHeight) {\n try {\n const parsedData = JSON.parse(trackData || '{}');\n\n if (parsedData.eventTracker !== 'visibility') return;\n\n pushToDataLayer(parsedData);\n console.log('[TagTracker] Visibility Event:', parsedData);\n window.removeEventListener('scroll', handleVisibilityTracking);\n } catch (error) {\n console.warn('Visibility tracking failed:', error);\n }\n }\n });\n }\n };\n\n const trackCustomEvent = (eventData: DataLayerEventProps) => {\n if (enableCustomTracking) {\n if (typeof eventData !== 'object') {\n console.warn('trackCustomEvent requires an object parameter');\n return;\n }\n\n pushToDataLayer(eventData);\n console.log('[TagTracker] Custom Event:', eventData);\n }\n };\n\n useEffect(() => {\n document.addEventListener('click', handleEvent);\n\n if (enableHoverTracking) {\n document.addEventListener('mouseover', handleHoverTracking);\n }\n\n if (enableVisibilityTracking) {\n window.addEventListener('scroll', handleVisibilityTracking);\n }\n\n return () => {\n document.removeEventListener('click', handleEvent);\n\n if (enableHoverTracking) {\n document.removeEventListener('mouseover', handleHoverTracking);\n }\n\n if (enableVisibilityTracking) {\n window.removeEventListener('scroll', handleVisibilityTracking);\n }\n };\n }, [trackingAttribute, enableHoverTracking, enableVisibilityTracking, enableCustomTracking]);\n\n return (\n <TagTrackerContext.Provider value={{ trackCustomEvent }}>{children}</TagTrackerContext.Provider>\n );\n};\n\nexport default TagTrackerProvider;\n", "import { createContext, useContext } from 'react';\nimport { DataLayerEventProps } from './types';\n\ninterface TagTrackerContextType {\n trackCustomEvent: (eventData: DataLayerEventProps) => void;\n}\n\nconst TagTrackerContext = createContext<TagTrackerContextType | null>(null);\n\nexport const useTagTracker = () => {\n const context = useContext(TagTrackerContext);\n\n if (!context) throw new Error('useTagTracker must be used within a TagTrackerProvider');\n return context;\n};\n\nexport default TagTrackerContext;\n"],
|
|
5
|
+
"mappings": "AAAA,OAAS,aAAAA,MAAiB,QCA1B,OAAS,iBAAAC,EAAe,cAAAC,MAAkB,QAO1C,IAAMC,EAAoBF,EAA4C,IAAI,EAE7DG,EAAgB,IAAM,CACjC,IAAMC,EAAUH,EAAWC,CAAiB,EAE5C,GAAI,CAACE,EAAS,MAAM,IAAI,MAAM,wDAAwD,EACtF,OAAOA,CACT,EAEOC,EAAQH,EDoHX,cAAAI,MAAA,oBAhIJ,IAAMC,EAAsBC,GAAmC,CAC7D,GAAM,CACJ,SAAAC,EACA,kBAAAC,EAAoB,aACpB,oBAAAC,EAAsB,GACtB,yBAAAC,EAA2B,GAC3B,qBAAAC,EAAuB,EACzB,EAAIL,EAEEM,EAAmBC,GAA8B,CACrD,GAAI,CACF,OAAO,UAAY,OAAO,WAAa,CAAC,EACxC,OAAO,UAAU,KAAKA,CAAI,CAC5B,OAASC,EAAO,CAEhB,CACF,EAEMC,EAAeC,GAA4B,CAC/C,IAAIC,EAAUD,EAAM,OAEpB,KAAOC,GAAW,CAACA,EAAQ,aAAaT,CAAiB,GACvDS,EAAUA,EAAQ,cAGpB,GAAIA,EAAS,CACX,IAAMC,EAAYD,EAAQ,aAAaT,CAAiB,EAExD,GAAI,CACF,IAAMW,EAAkC,KAAK,MAAMD,GAAa,IAAI,EAEpE,GAAI,CAAC,QAAS,YAAY,EAAE,SAASC,EAAW,YAAY,EAAG,OAC/D,GAAI,CAACA,EAAW,aAAc,MAAM,IAAI,MAAM,4BAA4B,EAE1EP,EAAgBO,CAAU,CAE5B,OAASL,EAAO,CAEhB,CACF,CACF,EAEMM,EAAuBJ,GAA4B,CACvD,GAAIP,EAAqB,CACvB,IAAIQ,EAAUD,EAAM,OAEpB,KAAOC,GAAW,CAACA,EAAQ,aAAaT,CAAiB,GACvDS,EAAUA,EAAQ,cAEpB,GAAIA,EAAS,CACX,IAAMC,EAAYD,EAAQ,aAAaT,CAAiB,EAExD,GAAI,CACF,IAAMW,EAAkC,KAAK,MAAMD,GAAa,IAAI,EAEpE,GAAIC,EAAW,eAAiB,QAAS,OAEzCP,EAAgBO,CAAU,CAE5B,OAASL,EAAO,CAEhB,CACF,CACF,CACF,EAEMO,EAA2B,IAAM,CACjCX,GACe,SAAS,iBAAiB,IAAIF,CAAiB,GAAG,EAE1D,QAASS,GAAY,CAC5B,IAAMC,EAAYD,EAAQ,aAAaT,CAAiB,EAClDc,EAAOL,EAAQ,sBAAsB,EAE3C,GAAIK,EAAK,KAAO,GAAKA,EAAK,QAAU,OAAO,YACzC,GAAI,CACF,IAAMH,EAAa,KAAK,MAAMD,GAAa,IAAI,EAE/C,GAAIC,EAAW,eAAiB,aAAc,OAE9CP,EAAgBO,CAAU,EAE1B,OAAO,oBAAoB,SAAUE,CAAwB,CAC/D,OAASP,EAAO,CAEhB,CAEJ,CAAC,CAEL,EAEMS,EAAoBC,GAAmC,CAC3D,GAAIb,EAAsB,CACxB,GAAI,OAAOa,GAAc,SAEvB,OAGFZ,EAAgBY,CAAS,CAE3B,CACF,EAEA,OAAAC,EAAU,KACR,SAAS,iBAAiB,QAASV,CAAW,EAE1CN,GACF,SAAS,iBAAiB,YAAaW,CAAmB,EAGxDV,GACF,OAAO,iBAAiB,SAAUW,CAAwB,EAGrD,IAAM,CACX,SAAS,oBAAoB,QAASN,CAAW,EAE7CN,GACF,SAAS,oBAAoB,YAAaW,CAAmB,EAG3DV,GACF,OAAO,oBAAoB,SAAUW,CAAwB,CAEjE,GACC,CAACb,EAAmBC,EAAqBC,EAA0BC,CAAoB,CAAC,EAGzFP,EAACsB,EAAkB,SAAlB,CAA2B,MAAO,CAAE,iBAAAH,CAAiB,EAAI,SAAAhB,EAAS,CAEvE,EAEOoB,EAAQtB",
|
|
6
|
+
"names": ["useEffect", "createContext", "useContext", "TagTrackerContext", "useTagTracker", "context", "TagTrackerContext_default", "jsx", "TagTrackerProvider", "props", "children", "trackingAttribute", "enableHoverTracking", "enableVisibilityTracking", "enableCustomTracking", "pushToDataLayer", "data", "error", "handleEvent", "event", "element", "trackData", "parsedData", "handleHoverTracking", "handleVisibilityTracking", "rect", "trackCustomEvent", "eventData", "useEffect", "TagTrackerContext_default", "TagTrackerProvider_default"]
|
|
7
7
|
}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
type DataPrefixedString = `data-${string}`;
|
|
3
3
|
export interface DataLayerEventProps {
|
|
4
|
-
|
|
4
|
+
eventTracker: 'click' | 'hover' | 'visibility' | string;
|
|
5
5
|
[key: string]: string;
|
|
6
6
|
}
|
|
7
7
|
export interface TagTrackerProviderProps {
|
package/package.json
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-tag-tracker",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "A React provider that simplifies tracking custom events and sends them to window.dataLayer, streamlining integration with GTM.",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "dist/index.
|
|
7
|
-
"
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
8
16
|
"files": [
|
|
9
17
|
"dist"
|
|
10
18
|
],
|
|
11
|
-
"publishConfig": {
|
|
12
|
-
"registry": "https://registry.npmjs.org/"
|
|
13
|
-
},
|
|
14
19
|
"keywords": [
|
|
15
20
|
"react",
|
|
16
21
|
"gtm",
|
|
@@ -30,26 +35,26 @@
|
|
|
30
35
|
},
|
|
31
36
|
"license": "MIT",
|
|
32
37
|
"devDependencies": {
|
|
33
|
-
"@eslint/js": "^
|
|
34
|
-
"@size-limit/preset-small-lib": "^
|
|
35
|
-
"@testing-library/jest-dom": "^6.
|
|
36
|
-
"@testing-library/react": "^16.3.
|
|
37
|
-
"@types/jest": "^
|
|
38
|
-
"@types/node": "^
|
|
39
|
-
"@types/react": "^19.
|
|
40
|
-
"@types/react-dom": "^19.
|
|
41
|
-
"esbuild": "0.
|
|
42
|
-
"eslint": "^
|
|
43
|
-
"eslint-plugin-react": "^7.37.
|
|
44
|
-
"globals": "^
|
|
45
|
-
"jest": "^
|
|
46
|
-
"jest-environment-jsdom": "^
|
|
47
|
-
"react": "^19.
|
|
48
|
-
"react-dom": "^19.
|
|
49
|
-
"size-limit": "^
|
|
50
|
-
"ts-jest": "^29.
|
|
51
|
-
"typescript": "^5.
|
|
52
|
-
"typescript-eslint": "^8.
|
|
38
|
+
"@eslint/js": "^10.0.1",
|
|
39
|
+
"@size-limit/preset-small-lib": "^12.0.0",
|
|
40
|
+
"@testing-library/jest-dom": "^6.9.1",
|
|
41
|
+
"@testing-library/react": "^16.3.2",
|
|
42
|
+
"@types/jest": "^30.0.0",
|
|
43
|
+
"@types/node": "^25.3.0",
|
|
44
|
+
"@types/react": "^19.2.14",
|
|
45
|
+
"@types/react-dom": "^19.2.3",
|
|
46
|
+
"esbuild": "0.27.3",
|
|
47
|
+
"eslint": "^10.0.0",
|
|
48
|
+
"eslint-plugin-react": "^7.37.5",
|
|
49
|
+
"globals": "^17.3.0",
|
|
50
|
+
"jest": "^30.2.0",
|
|
51
|
+
"jest-environment-jsdom": "^30.2.0",
|
|
52
|
+
"react": "^19.2.4",
|
|
53
|
+
"react-dom": "^19.2.4",
|
|
54
|
+
"size-limit": "^12.0.0",
|
|
55
|
+
"ts-jest": "^29.4.6",
|
|
56
|
+
"typescript": "^5.9.3",
|
|
57
|
+
"typescript-eslint": "^8.56.0"
|
|
53
58
|
},
|
|
54
59
|
"peerDependencies": {
|
|
55
60
|
"react": "*",
|