react-tag-tracker 0.1.3 → 0.1.4

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.js CHANGED
@@ -30,6 +30,7 @@ var TagTrackerProvider = (props) => {
30
30
  const trackData = element.getAttribute(trackingAttribute);
31
31
  try {
32
32
  const parsedData = JSON.parse(trackData || "{}");
33
+ if (["hover", "visibility"].includes(parsedData.event)) return;
33
34
  if (!parsedData.event) throw new Error("Event property is required");
34
35
  window.dataLayer = window.dataLayer || [];
35
36
  window.dataLayer.push(parsedData);
@@ -49,7 +50,7 @@ var TagTrackerProvider = (props) => {
49
50
  const trackData = element.getAttribute(trackingAttribute);
50
51
  try {
51
52
  const parsedData = JSON.parse(trackData || "{}");
52
- parsedData.event = "hover";
53
+ if (parsedData.event !== "hover") return;
53
54
  window.dataLayer = window.dataLayer || [];
54
55
  window.dataLayer.push(parsedData);
55
56
  console.log("[TagTracker] Hover Event:", parsedData);
@@ -68,10 +69,11 @@ var TagTrackerProvider = (props) => {
68
69
  if (rect.top >= 0 && rect.bottom <= window.innerHeight) {
69
70
  try {
70
71
  const parsedData = JSON.parse(trackData || "{}");
71
- parsedData.event = "visibility";
72
+ if (parsedData.event !== "visibility") return;
72
73
  window.dataLayer = window.dataLayer || [];
73
74
  window.dataLayer.push(parsedData);
74
75
  console.log("[TagTracker] Visibility Event:", parsedData);
76
+ window.removeEventListener("scroll", handleVisibilityTracking);
75
77
  } catch (error) {
76
78
  console.warn("Visibility tracking failed:", error);
77
79
  }
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 if (!parsedData.event) throw new Error('Event property is required');\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(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\n if (element) {\n const trackData = element.getAttribute(trackingAttribute);\n\n try {\n const parsedData: DataLayerEventProps = JSON.parse(trackData || '{}');\n parsedData.event = 'hover';\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(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 parsedData.event = 'visibility';\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(parsedData);\n console.log('[TagTracker] Visibility Event:', parsedData);\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 window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(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 }}>\n { children }\n </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": "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",
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.event)) return;\n if (!parsedData.event) throw new Error('Event property is required');\n\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(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.event !== 'hover') return;\n\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(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.event !== 'visibility') return;\n\n window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(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 window.dataLayer = window.dataLayer || [];\n window.dataLayer.push(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 }}>\n { children }\n </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": "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",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-tag-tracker",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
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
6
  "main": "dist/index.js",