@simpleapps-com/augur-web 1.0.6 → 1.0.8
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/chunk-ECNNL5MU.cjs +145 -0
- package/dist/chunk-ECNNL5MU.cjs.map +1 -0
- package/dist/chunk-YR2SJWTF.js +145 -0
- package/dist/chunk-YR2SJWTF.js.map +1 -0
- package/dist/gtm.cjs +2 -128
- package/dist/gtm.cjs.map +1 -1
- package/dist/gtm.js +7 -133
- package/dist/gtm.js.map +1 -1
- package/dist/provider.cjs +31 -0
- package/dist/provider.cjs.map +1 -0
- package/dist/provider.d.cts +31 -0
- package/dist/provider.d.ts +31 -0
- package/dist/provider.js +31 -0
- package/dist/provider.js.map +1 -0
- package/package.json +14 -4
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
// src/gtm.tsx
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
var _react = require('react');
|
|
12
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
13
|
+
var AnalyticsContext = _react.createContext.call(void 0, null);
|
|
14
|
+
function getDataLayer() {
|
|
15
|
+
if (typeof window === "undefined") return [];
|
|
16
|
+
if (!window.dataLayer) window.dataLayer = [];
|
|
17
|
+
return window.dataLayer;
|
|
18
|
+
}
|
|
19
|
+
function injectGtmScript(gtmId, strategy) {
|
|
20
|
+
if (typeof document === "undefined") return;
|
|
21
|
+
if (document.getElementById("gtm-script")) return;
|
|
22
|
+
const dataLayer = getDataLayer();
|
|
23
|
+
dataLayer.push({ "gtm.start": (/* @__PURE__ */ new Date()).getTime(), event: "gtm.js" });
|
|
24
|
+
const script = document.createElement("script");
|
|
25
|
+
script.id = "gtm-script";
|
|
26
|
+
script.src = `https://www.googletagmanager.com/gtm.js?id=${encodeURIComponent(gtmId)}`;
|
|
27
|
+
if (strategy === "lazyOnload") {
|
|
28
|
+
script.async = true;
|
|
29
|
+
script.defer = true;
|
|
30
|
+
} else {
|
|
31
|
+
script.async = true;
|
|
32
|
+
}
|
|
33
|
+
document.head.appendChild(script);
|
|
34
|
+
}
|
|
35
|
+
function AnalyticsProvider({
|
|
36
|
+
gtmId,
|
|
37
|
+
strategy = "afterInteractive",
|
|
38
|
+
consentRequired = false,
|
|
39
|
+
debug = false,
|
|
40
|
+
children
|
|
41
|
+
}) {
|
|
42
|
+
const [hasConsent, setHasConsent] = _react.useState.call(void 0, !consentRequired);
|
|
43
|
+
const [isLoaded, setIsLoaded] = _react.useState.call(void 0, false);
|
|
44
|
+
const injectedRef = _react.useRef.call(void 0, false);
|
|
45
|
+
const loadGtm = _react.useCallback.call(void 0, () => {
|
|
46
|
+
if (injectedRef.current) return;
|
|
47
|
+
injectedRef.current = true;
|
|
48
|
+
if (strategy === "lazyOnload" && typeof requestIdleCallback === "function") {
|
|
49
|
+
requestIdleCallback(() => {
|
|
50
|
+
injectGtmScript(gtmId, strategy);
|
|
51
|
+
setIsLoaded(true);
|
|
52
|
+
});
|
|
53
|
+
} else if (strategy === "afterInteractive") {
|
|
54
|
+
setTimeout(() => {
|
|
55
|
+
injectGtmScript(gtmId, strategy);
|
|
56
|
+
setIsLoaded(true);
|
|
57
|
+
}, 0);
|
|
58
|
+
} else {
|
|
59
|
+
injectGtmScript(gtmId, strategy);
|
|
60
|
+
setIsLoaded(true);
|
|
61
|
+
}
|
|
62
|
+
}, [gtmId, strategy]);
|
|
63
|
+
if (hasConsent && !injectedRef.current && typeof window !== "undefined") {
|
|
64
|
+
loadGtm();
|
|
65
|
+
}
|
|
66
|
+
const trackEvent = _react.useCallback.call(void 0,
|
|
67
|
+
(event, params) => {
|
|
68
|
+
const entry = { event, ...params };
|
|
69
|
+
if (debug) {
|
|
70
|
+
console.log("[Analytics]", entry);
|
|
71
|
+
}
|
|
72
|
+
getDataLayer().push(entry);
|
|
73
|
+
},
|
|
74
|
+
[debug]
|
|
75
|
+
);
|
|
76
|
+
const trackEcommerceEvent = _react.useCallback.call(void 0,
|
|
77
|
+
(event, params) => {
|
|
78
|
+
getDataLayer().push({ ecommerce: null });
|
|
79
|
+
const entry = { event, ecommerce: params };
|
|
80
|
+
if (debug) {
|
|
81
|
+
console.log("[Analytics ecommerce]", entry);
|
|
82
|
+
}
|
|
83
|
+
getDataLayer().push(entry);
|
|
84
|
+
},
|
|
85
|
+
[debug]
|
|
86
|
+
);
|
|
87
|
+
const grantConsent = _react.useCallback.call(void 0, () => {
|
|
88
|
+
setHasConsent(true);
|
|
89
|
+
loadGtm();
|
|
90
|
+
}, [loadGtm]);
|
|
91
|
+
const revokeConsent = _react.useCallback.call(void 0, () => {
|
|
92
|
+
setHasConsent(false);
|
|
93
|
+
}, []);
|
|
94
|
+
const value = _react.useMemo.call(void 0,
|
|
95
|
+
() => ({
|
|
96
|
+
trackEvent,
|
|
97
|
+
trackEcommerceEvent,
|
|
98
|
+
grantConsent,
|
|
99
|
+
revokeConsent,
|
|
100
|
+
hasConsent,
|
|
101
|
+
isLoaded
|
|
102
|
+
}),
|
|
103
|
+
[
|
|
104
|
+
trackEvent,
|
|
105
|
+
trackEcommerceEvent,
|
|
106
|
+
grantConsent,
|
|
107
|
+
revokeConsent,
|
|
108
|
+
hasConsent,
|
|
109
|
+
isLoaded
|
|
110
|
+
]
|
|
111
|
+
);
|
|
112
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsContext.Provider, { value, children });
|
|
113
|
+
}
|
|
114
|
+
function useAnalytics() {
|
|
115
|
+
const context = _react.useContext.call(void 0, AnalyticsContext);
|
|
116
|
+
if (!context) {
|
|
117
|
+
throw new Error("useAnalytics must be used within an <AnalyticsProvider>");
|
|
118
|
+
}
|
|
119
|
+
return context;
|
|
120
|
+
}
|
|
121
|
+
function AnalyticsNoscript({ gtmId }) {
|
|
122
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "noscript", { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
123
|
+
"iframe",
|
|
124
|
+
{
|
|
125
|
+
src: `https://www.googletagmanager.com/ns.html?id=${encodeURIComponent(gtmId)}`,
|
|
126
|
+
height: "0",
|
|
127
|
+
width: "0",
|
|
128
|
+
style: { display: "none", visibility: "hidden" },
|
|
129
|
+
title: "Google Tag Manager"
|
|
130
|
+
}
|
|
131
|
+
) });
|
|
132
|
+
}
|
|
133
|
+
var GtmProvider = AnalyticsProvider;
|
|
134
|
+
var useGtm = useAnalytics;
|
|
135
|
+
var GtmNoscript = AnalyticsNoscript;
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
exports.AnalyticsProvider = AnalyticsProvider; exports.useAnalytics = useAnalytics; exports.AnalyticsNoscript = AnalyticsNoscript; exports.GtmProvider = GtmProvider; exports.useGtm = useGtm; exports.GtmNoscript = GtmNoscript;
|
|
145
|
+
//# sourceMappingURL=chunk-ECNNL5MU.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/chunk-ECNNL5MU.cjs","../src/gtm.tsx"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACA;ACAA;AACE;AACA;AACA;AACA;AACA;AACA;AAAA,8BACK;AAiOH,+CAAA;AA9IJ,IAAM,iBAAA,EAAmB,kCAAA,IAAgD,CAAA;AAYzE,SAAS,YAAA,CAAA,EAA0C;AAEjD,EAAA,GAAA,CAAI,OAAO,OAAA,IAAW,WAAA,EAAa,OAAO,CAAC,CAAA;AAC3C,EAAA,GAAA,CAAI,CAAC,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,UAAA,EAAY,CAAC,CAAA;AAC3C,EAAA,OAAO,MAAA,CAAO,SAAA;AAChB;AAEA,SAAS,eAAA,CACP,KAAA,EACA,QAAA,EACM;AAEN,EAAA,GAAA,CAAI,OAAO,SAAA,IAAa,WAAA,EAAa,MAAA;AAGrC,EAAA,GAAA,CAAI,QAAA,CAAS,cAAA,CAAe,YAAY,CAAA,EAAG,MAAA;AAE3C,EAAA,MAAM,UAAA,EAAY,YAAA,CAAa,CAAA;AAC/B,EAAA,SAAA,CAAU,IAAA,CAAK,EAAE,WAAA,EAAA,iBAAa,IAAI,IAAA,CAAK,CAAA,CAAA,CAAE,OAAA,CAAQ,CAAA,EAAG,KAAA,EAAO,SAAS,CAAC,CAAA;AAErE,EAAA,MAAM,OAAA,EAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,GAAA,EAAK,YAAA;AACZ,EAAA,MAAA,CAAO,IAAA,EAAM,CAAA,2CAAA,EAA8C,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAErD,EAAA;AACd,IAAA;AACA,IAAA;AACV,EAAA;AAEU,IAAA;AACjB,EAAA;AAEgC,EAAA;AAClC;AAMkC;AAChC,EAAA;AACW,EAAA;AACO,EAAA;AACV,EAAA;AACR,EAAA;AACyB;AACoC,EAAA;AACf,EAAA;AACd,EAAA;AAEE,EAAA;AACP,IAAA;AACH,IAAA;AAEsD,IAAA;AAChD,MAAA;AACO,QAAA;AACf,QAAA;AACjB,MAAA;AACyC,IAAA;AAEzB,MAAA;AACgB,QAAA;AACf,QAAA;AACd,MAAA;AACC,IAAA;AAC0B,MAAA;AACf,MAAA;AAClB,IAAA;AACkB,EAAA;AAIqD,EAAA;AAC/D,IAAA;AACV,EAAA;AAEmB,EAAA;AACoC,IAAA;AAClB,MAAA;AACtB,MAAA;AACuB,QAAA;AAClC,MAAA;AACyB,MAAA;AAC3B,IAAA;AACM,IAAA;AACR,EAAA;AAE4B,EAAA;AAC0B,IAAA;AAEX,MAAA;AACE,MAAA;AAC9B,MAAA;AACiC,QAAA;AAC5C,MAAA;AACyB,MAAA;AAC3B,IAAA;AACM,IAAA;AACR,EAAA;AAEuC,EAAA;AACnB,IAAA;AACV,IAAA;AACE,EAAA;AAE4B,EAAA;AACnB,IAAA;AAChB,EAAA;AAES,EAAA;AACL,IAAA;AACL,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACA,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAKE,EAAA;AAEJ;AAMsD;AACT,EAAA;AAC7B,EAAA;AAC6D,IAAA;AAC3E,EAAA;AACO,EAAA;AACT;AAWqE;AAG/D,EAAA;AAAC,IAAA;AAAA,IAAA;AAC8E,MAAA;AACtE,MAAA;AACD,MAAA;AACyC,MAAA;AACzC,MAAA;AAAA,IAAA;AAEV,EAAA;AAEJ;AAsB2B;AAEL;AAEK;ADpK4D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/chunk-ECNNL5MU.cjs","sourcesContent":[null,"\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ReactNode } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Script loading strategy. */\nexport type AnalyticsStrategy = \"default\" | \"afterInteractive\" | \"lazyOnload\";\n\n/** GA4 standard e-commerce event names. */\nexport type EcommerceEvent =\n | \"view_item\"\n | \"view_item_list\"\n | \"select_item\"\n | \"add_to_cart\"\n | \"remove_from_cart\"\n | \"view_cart\"\n | \"begin_checkout\"\n | \"add_shipping_info\"\n | \"add_payment_info\"\n | \"purchase\"\n | \"refund\";\n\n/** GA4 e-commerce item shape. */\nexport interface EcommerceItem {\n item_id: string;\n item_name?: string;\n item_brand?: string;\n item_category?: string;\n item_variant?: string;\n price?: number;\n quantity?: number;\n index?: number;\n [key: string]: unknown;\n}\n\n/** Parameters for e-commerce events. */\nexport interface EcommerceParams {\n currency?: string;\n value?: number;\n items?: EcommerceItem[];\n transaction_id?: string;\n shipping?: number;\n tax?: number;\n coupon?: string;\n [key: string]: unknown;\n}\n\nexport interface AnalyticsProviderProps {\n /** GTM container ID (e.g. \"GTM-XXXXX\"). */\n gtmId: string;\n /** Script loading strategy. Default: \"afterInteractive\". */\n strategy?: AnalyticsStrategy;\n /** Delay GTM loading until consent is granted. Default: false. */\n consentRequired?: boolean;\n /** Log dataLayer pushes to console. Default: false. */\n debug?: boolean;\n children: ReactNode;\n}\n\nexport interface AnalyticsContextValue {\n /** Push a custom event to the dataLayer. */\n trackEvent: (event: string, params?: Record<string, unknown>) => void;\n /** Push a GA4 e-commerce event to the dataLayer. */\n trackEcommerceEvent: (\n event: EcommerceEvent,\n params: EcommerceParams,\n ) => void;\n /** Grant consent — loads GTM if consentRequired was true. */\n grantConsent: () => void;\n /** Revoke consent. Does not unload GTM (scripts can't be unloaded). */\n revokeConsent: () => void;\n /** Whether consent has been granted. */\n hasConsent: boolean;\n /** Whether the GTM script has been injected. */\n isLoaded: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nconst AnalyticsContext = createContext<AnalyticsContextValue | null>(null);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ndeclare global {\n interface Window {\n dataLayer?: Record<string, unknown>[];\n }\n}\n\nfunction getDataLayer(): Record<string, unknown>[] {\n /* v8 ignore next */\n if (typeof window === \"undefined\") return [];\n if (!window.dataLayer) window.dataLayer = [];\n return window.dataLayer;\n}\n\nfunction injectGtmScript(\n gtmId: string,\n strategy: AnalyticsStrategy,\n): void {\n /* v8 ignore next */\n if (typeof document === \"undefined\") return;\n\n // Prevent double-injection\n if (document.getElementById(\"gtm-script\")) return;\n\n const dataLayer = getDataLayer();\n dataLayer.push({ \"gtm.start\": new Date().getTime(), event: \"gtm.js\" });\n\n const script = document.createElement(\"script\");\n script.id = \"gtm-script\";\n script.src = `https://www.googletagmanager.com/gtm.js?id=${encodeURIComponent(gtmId)}`;\n\n if (strategy === \"lazyOnload\") {\n script.async = true;\n script.defer = true;\n } else {\n // \"default\" and \"afterInteractive\"\n script.async = true;\n }\n\n document.head.appendChild(script);\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport function AnalyticsProvider({\n gtmId,\n strategy = \"afterInteractive\",\n consentRequired = false,\n debug = false,\n children,\n}: AnalyticsProviderProps) {\n const [hasConsent, setHasConsent] = useState(!consentRequired);\n const [isLoaded, setIsLoaded] = useState(false);\n const injectedRef = useRef(false);\n\n const loadGtm = useCallback(() => {\n if (injectedRef.current) return;\n injectedRef.current = true;\n\n if (strategy === \"lazyOnload\" && typeof requestIdleCallback === \"function\") {\n requestIdleCallback(() => {\n injectGtmScript(gtmId, strategy);\n setIsLoaded(true);\n });\n } else if (strategy === \"afterInteractive\") {\n // Defer to after hydration\n setTimeout(() => {\n injectGtmScript(gtmId, strategy);\n setIsLoaded(true);\n }, 0);\n } else {\n injectGtmScript(gtmId, strategy);\n setIsLoaded(true);\n }\n }, [gtmId, strategy]);\n\n // Auto-load when consent is not required or already granted\n /* v8 ignore next */\n if (hasConsent && !injectedRef.current && typeof window !== \"undefined\") {\n loadGtm();\n }\n\n const trackEvent = useCallback(\n (event: string, params?: Record<string, unknown>) => {\n const entry = { event, ...params };\n if (debug) {\n console.log(\"[Analytics]\", entry);\n }\n getDataLayer().push(entry);\n },\n [debug],\n );\n\n const trackEcommerceEvent = useCallback(\n (event: EcommerceEvent, params: EcommerceParams) => {\n // Clear previous ecommerce data per GA4 best practices\n getDataLayer().push({ ecommerce: null });\n const entry = { event, ecommerce: params };\n if (debug) {\n console.log(\"[Analytics ecommerce]\", entry);\n }\n getDataLayer().push(entry);\n },\n [debug],\n );\n\n const grantConsent = useCallback(() => {\n setHasConsent(true);\n loadGtm();\n }, [loadGtm]);\n\n const revokeConsent = useCallback(() => {\n setHasConsent(false);\n }, []);\n\n const value = useMemo<AnalyticsContextValue>(\n () => ({\n trackEvent,\n trackEcommerceEvent,\n grantConsent,\n revokeConsent,\n hasConsent,\n isLoaded,\n }),\n [\n trackEvent,\n trackEcommerceEvent,\n grantConsent,\n revokeConsent,\n hasConsent,\n isLoaded,\n ],\n );\n\n return (\n <AnalyticsContext.Provider value={value}>\n {children}\n </AnalyticsContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useAnalytics(): AnalyticsContextValue {\n const context = useContext(AnalyticsContext);\n if (!context) {\n throw new Error(\"useAnalytics must be used within an <AnalyticsProvider>\");\n }\n return context;\n}\n\n// ---------------------------------------------------------------------------\n// Noscript\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsNoscriptProps {\n /** GTM container ID (must match AnalyticsProvider). */\n gtmId: string;\n}\n\nexport function AnalyticsNoscript({ gtmId }: AnalyticsNoscriptProps) {\n return (\n <noscript>\n <iframe\n src={`https://www.googletagmanager.com/ns.html?id=${encodeURIComponent(gtmId)}`}\n height=\"0\"\n width=\"0\"\n style={{ display: \"none\", visibility: \"hidden\" }}\n title=\"Google Tag Manager\"\n />\n </noscript>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Backward-compatible aliases (from #59 GtmProvider)\n// ---------------------------------------------------------------------------\n\n/** @deprecated Use `AnalyticsStrategy` instead. */\nexport type GtmStrategy = AnalyticsStrategy;\n/** @deprecated Use `EcommerceEvent` instead. */\nexport type GtmEcommerceEvent = EcommerceEvent;\n/** @deprecated Use `EcommerceItem` instead. */\nexport type GtmItem = EcommerceItem;\n/** @deprecated Use `EcommerceParams` instead. */\nexport type GtmEcommerceParams = EcommerceParams;\n/** @deprecated Use `AnalyticsProviderProps` instead. */\nexport type GtmProviderProps = AnalyticsProviderProps;\n/** @deprecated Use `AnalyticsContextValue` instead. */\nexport type GtmContextValue = AnalyticsContextValue;\n/** @deprecated Use `AnalyticsNoscriptProps` instead. */\nexport type GtmNoscriptProps = AnalyticsNoscriptProps;\n\n/** @deprecated Use `AnalyticsProvider` instead. */\nexport const GtmProvider = AnalyticsProvider;\n/** @deprecated Use `useAnalytics` instead. */\nexport const useGtm = useAnalytics;\n/** @deprecated Use `AnalyticsNoscript` instead. */\nexport const GtmNoscript = AnalyticsNoscript;\n"]}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/gtm.tsx
|
|
4
|
+
import {
|
|
5
|
+
createContext,
|
|
6
|
+
useCallback,
|
|
7
|
+
useContext,
|
|
8
|
+
useMemo,
|
|
9
|
+
useRef,
|
|
10
|
+
useState
|
|
11
|
+
} from "react";
|
|
12
|
+
import { jsx } from "react/jsx-runtime";
|
|
13
|
+
var AnalyticsContext = createContext(null);
|
|
14
|
+
function getDataLayer() {
|
|
15
|
+
if (typeof window === "undefined") return [];
|
|
16
|
+
if (!window.dataLayer) window.dataLayer = [];
|
|
17
|
+
return window.dataLayer;
|
|
18
|
+
}
|
|
19
|
+
function injectGtmScript(gtmId, strategy) {
|
|
20
|
+
if (typeof document === "undefined") return;
|
|
21
|
+
if (document.getElementById("gtm-script")) return;
|
|
22
|
+
const dataLayer = getDataLayer();
|
|
23
|
+
dataLayer.push({ "gtm.start": (/* @__PURE__ */ new Date()).getTime(), event: "gtm.js" });
|
|
24
|
+
const script = document.createElement("script");
|
|
25
|
+
script.id = "gtm-script";
|
|
26
|
+
script.src = `https://www.googletagmanager.com/gtm.js?id=${encodeURIComponent(gtmId)}`;
|
|
27
|
+
if (strategy === "lazyOnload") {
|
|
28
|
+
script.async = true;
|
|
29
|
+
script.defer = true;
|
|
30
|
+
} else {
|
|
31
|
+
script.async = true;
|
|
32
|
+
}
|
|
33
|
+
document.head.appendChild(script);
|
|
34
|
+
}
|
|
35
|
+
function AnalyticsProvider({
|
|
36
|
+
gtmId,
|
|
37
|
+
strategy = "afterInteractive",
|
|
38
|
+
consentRequired = false,
|
|
39
|
+
debug = false,
|
|
40
|
+
children
|
|
41
|
+
}) {
|
|
42
|
+
const [hasConsent, setHasConsent] = useState(!consentRequired);
|
|
43
|
+
const [isLoaded, setIsLoaded] = useState(false);
|
|
44
|
+
const injectedRef = useRef(false);
|
|
45
|
+
const loadGtm = useCallback(() => {
|
|
46
|
+
if (injectedRef.current) return;
|
|
47
|
+
injectedRef.current = true;
|
|
48
|
+
if (strategy === "lazyOnload" && typeof requestIdleCallback === "function") {
|
|
49
|
+
requestIdleCallback(() => {
|
|
50
|
+
injectGtmScript(gtmId, strategy);
|
|
51
|
+
setIsLoaded(true);
|
|
52
|
+
});
|
|
53
|
+
} else if (strategy === "afterInteractive") {
|
|
54
|
+
setTimeout(() => {
|
|
55
|
+
injectGtmScript(gtmId, strategy);
|
|
56
|
+
setIsLoaded(true);
|
|
57
|
+
}, 0);
|
|
58
|
+
} else {
|
|
59
|
+
injectGtmScript(gtmId, strategy);
|
|
60
|
+
setIsLoaded(true);
|
|
61
|
+
}
|
|
62
|
+
}, [gtmId, strategy]);
|
|
63
|
+
if (hasConsent && !injectedRef.current && typeof window !== "undefined") {
|
|
64
|
+
loadGtm();
|
|
65
|
+
}
|
|
66
|
+
const trackEvent = useCallback(
|
|
67
|
+
(event, params) => {
|
|
68
|
+
const entry = { event, ...params };
|
|
69
|
+
if (debug) {
|
|
70
|
+
console.log("[Analytics]", entry);
|
|
71
|
+
}
|
|
72
|
+
getDataLayer().push(entry);
|
|
73
|
+
},
|
|
74
|
+
[debug]
|
|
75
|
+
);
|
|
76
|
+
const trackEcommerceEvent = useCallback(
|
|
77
|
+
(event, params) => {
|
|
78
|
+
getDataLayer().push({ ecommerce: null });
|
|
79
|
+
const entry = { event, ecommerce: params };
|
|
80
|
+
if (debug) {
|
|
81
|
+
console.log("[Analytics ecommerce]", entry);
|
|
82
|
+
}
|
|
83
|
+
getDataLayer().push(entry);
|
|
84
|
+
},
|
|
85
|
+
[debug]
|
|
86
|
+
);
|
|
87
|
+
const grantConsent = useCallback(() => {
|
|
88
|
+
setHasConsent(true);
|
|
89
|
+
loadGtm();
|
|
90
|
+
}, [loadGtm]);
|
|
91
|
+
const revokeConsent = useCallback(() => {
|
|
92
|
+
setHasConsent(false);
|
|
93
|
+
}, []);
|
|
94
|
+
const value = useMemo(
|
|
95
|
+
() => ({
|
|
96
|
+
trackEvent,
|
|
97
|
+
trackEcommerceEvent,
|
|
98
|
+
grantConsent,
|
|
99
|
+
revokeConsent,
|
|
100
|
+
hasConsent,
|
|
101
|
+
isLoaded
|
|
102
|
+
}),
|
|
103
|
+
[
|
|
104
|
+
trackEvent,
|
|
105
|
+
trackEcommerceEvent,
|
|
106
|
+
grantConsent,
|
|
107
|
+
revokeConsent,
|
|
108
|
+
hasConsent,
|
|
109
|
+
isLoaded
|
|
110
|
+
]
|
|
111
|
+
);
|
|
112
|
+
return /* @__PURE__ */ jsx(AnalyticsContext.Provider, { value, children });
|
|
113
|
+
}
|
|
114
|
+
function useAnalytics() {
|
|
115
|
+
const context = useContext(AnalyticsContext);
|
|
116
|
+
if (!context) {
|
|
117
|
+
throw new Error("useAnalytics must be used within an <AnalyticsProvider>");
|
|
118
|
+
}
|
|
119
|
+
return context;
|
|
120
|
+
}
|
|
121
|
+
function AnalyticsNoscript({ gtmId }) {
|
|
122
|
+
return /* @__PURE__ */ jsx("noscript", { children: /* @__PURE__ */ jsx(
|
|
123
|
+
"iframe",
|
|
124
|
+
{
|
|
125
|
+
src: `https://www.googletagmanager.com/ns.html?id=${encodeURIComponent(gtmId)}`,
|
|
126
|
+
height: "0",
|
|
127
|
+
width: "0",
|
|
128
|
+
style: { display: "none", visibility: "hidden" },
|
|
129
|
+
title: "Google Tag Manager"
|
|
130
|
+
}
|
|
131
|
+
) });
|
|
132
|
+
}
|
|
133
|
+
var GtmProvider = AnalyticsProvider;
|
|
134
|
+
var useGtm = useAnalytics;
|
|
135
|
+
var GtmNoscript = AnalyticsNoscript;
|
|
136
|
+
|
|
137
|
+
export {
|
|
138
|
+
AnalyticsProvider,
|
|
139
|
+
useAnalytics,
|
|
140
|
+
AnalyticsNoscript,
|
|
141
|
+
GtmProvider,
|
|
142
|
+
useGtm,
|
|
143
|
+
GtmNoscript
|
|
144
|
+
};
|
|
145
|
+
//# sourceMappingURL=chunk-YR2SJWTF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/gtm.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ReactNode } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Script loading strategy. */\nexport type AnalyticsStrategy = \"default\" | \"afterInteractive\" | \"lazyOnload\";\n\n/** GA4 standard e-commerce event names. */\nexport type EcommerceEvent =\n | \"view_item\"\n | \"view_item_list\"\n | \"select_item\"\n | \"add_to_cart\"\n | \"remove_from_cart\"\n | \"view_cart\"\n | \"begin_checkout\"\n | \"add_shipping_info\"\n | \"add_payment_info\"\n | \"purchase\"\n | \"refund\";\n\n/** GA4 e-commerce item shape. */\nexport interface EcommerceItem {\n item_id: string;\n item_name?: string;\n item_brand?: string;\n item_category?: string;\n item_variant?: string;\n price?: number;\n quantity?: number;\n index?: number;\n [key: string]: unknown;\n}\n\n/** Parameters for e-commerce events. */\nexport interface EcommerceParams {\n currency?: string;\n value?: number;\n items?: EcommerceItem[];\n transaction_id?: string;\n shipping?: number;\n tax?: number;\n coupon?: string;\n [key: string]: unknown;\n}\n\nexport interface AnalyticsProviderProps {\n /** GTM container ID (e.g. \"GTM-XXXXX\"). */\n gtmId: string;\n /** Script loading strategy. Default: \"afterInteractive\". */\n strategy?: AnalyticsStrategy;\n /** Delay GTM loading until consent is granted. Default: false. */\n consentRequired?: boolean;\n /** Log dataLayer pushes to console. Default: false. */\n debug?: boolean;\n children: ReactNode;\n}\n\nexport interface AnalyticsContextValue {\n /** Push a custom event to the dataLayer. */\n trackEvent: (event: string, params?: Record<string, unknown>) => void;\n /** Push a GA4 e-commerce event to the dataLayer. */\n trackEcommerceEvent: (\n event: EcommerceEvent,\n params: EcommerceParams,\n ) => void;\n /** Grant consent — loads GTM if consentRequired was true. */\n grantConsent: () => void;\n /** Revoke consent. Does not unload GTM (scripts can't be unloaded). */\n revokeConsent: () => void;\n /** Whether consent has been granted. */\n hasConsent: boolean;\n /** Whether the GTM script has been injected. */\n isLoaded: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nconst AnalyticsContext = createContext<AnalyticsContextValue | null>(null);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ndeclare global {\n interface Window {\n dataLayer?: Record<string, unknown>[];\n }\n}\n\nfunction getDataLayer(): Record<string, unknown>[] {\n /* v8 ignore next */\n if (typeof window === \"undefined\") return [];\n if (!window.dataLayer) window.dataLayer = [];\n return window.dataLayer;\n}\n\nfunction injectGtmScript(\n gtmId: string,\n strategy: AnalyticsStrategy,\n): void {\n /* v8 ignore next */\n if (typeof document === \"undefined\") return;\n\n // Prevent double-injection\n if (document.getElementById(\"gtm-script\")) return;\n\n const dataLayer = getDataLayer();\n dataLayer.push({ \"gtm.start\": new Date().getTime(), event: \"gtm.js\" });\n\n const script = document.createElement(\"script\");\n script.id = \"gtm-script\";\n script.src = `https://www.googletagmanager.com/gtm.js?id=${encodeURIComponent(gtmId)}`;\n\n if (strategy === \"lazyOnload\") {\n script.async = true;\n script.defer = true;\n } else {\n // \"default\" and \"afterInteractive\"\n script.async = true;\n }\n\n document.head.appendChild(script);\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport function AnalyticsProvider({\n gtmId,\n strategy = \"afterInteractive\",\n consentRequired = false,\n debug = false,\n children,\n}: AnalyticsProviderProps) {\n const [hasConsent, setHasConsent] = useState(!consentRequired);\n const [isLoaded, setIsLoaded] = useState(false);\n const injectedRef = useRef(false);\n\n const loadGtm = useCallback(() => {\n if (injectedRef.current) return;\n injectedRef.current = true;\n\n if (strategy === \"lazyOnload\" && typeof requestIdleCallback === \"function\") {\n requestIdleCallback(() => {\n injectGtmScript(gtmId, strategy);\n setIsLoaded(true);\n });\n } else if (strategy === \"afterInteractive\") {\n // Defer to after hydration\n setTimeout(() => {\n injectGtmScript(gtmId, strategy);\n setIsLoaded(true);\n }, 0);\n } else {\n injectGtmScript(gtmId, strategy);\n setIsLoaded(true);\n }\n }, [gtmId, strategy]);\n\n // Auto-load when consent is not required or already granted\n /* v8 ignore next */\n if (hasConsent && !injectedRef.current && typeof window !== \"undefined\") {\n loadGtm();\n }\n\n const trackEvent = useCallback(\n (event: string, params?: Record<string, unknown>) => {\n const entry = { event, ...params };\n if (debug) {\n console.log(\"[Analytics]\", entry);\n }\n getDataLayer().push(entry);\n },\n [debug],\n );\n\n const trackEcommerceEvent = useCallback(\n (event: EcommerceEvent, params: EcommerceParams) => {\n // Clear previous ecommerce data per GA4 best practices\n getDataLayer().push({ ecommerce: null });\n const entry = { event, ecommerce: params };\n if (debug) {\n console.log(\"[Analytics ecommerce]\", entry);\n }\n getDataLayer().push(entry);\n },\n [debug],\n );\n\n const grantConsent = useCallback(() => {\n setHasConsent(true);\n loadGtm();\n }, [loadGtm]);\n\n const revokeConsent = useCallback(() => {\n setHasConsent(false);\n }, []);\n\n const value = useMemo<AnalyticsContextValue>(\n () => ({\n trackEvent,\n trackEcommerceEvent,\n grantConsent,\n revokeConsent,\n hasConsent,\n isLoaded,\n }),\n [\n trackEvent,\n trackEcommerceEvent,\n grantConsent,\n revokeConsent,\n hasConsent,\n isLoaded,\n ],\n );\n\n return (\n <AnalyticsContext.Provider value={value}>\n {children}\n </AnalyticsContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useAnalytics(): AnalyticsContextValue {\n const context = useContext(AnalyticsContext);\n if (!context) {\n throw new Error(\"useAnalytics must be used within an <AnalyticsProvider>\");\n }\n return context;\n}\n\n// ---------------------------------------------------------------------------\n// Noscript\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsNoscriptProps {\n /** GTM container ID (must match AnalyticsProvider). */\n gtmId: string;\n}\n\nexport function AnalyticsNoscript({ gtmId }: AnalyticsNoscriptProps) {\n return (\n <noscript>\n <iframe\n src={`https://www.googletagmanager.com/ns.html?id=${encodeURIComponent(gtmId)}`}\n height=\"0\"\n width=\"0\"\n style={{ display: \"none\", visibility: \"hidden\" }}\n title=\"Google Tag Manager\"\n />\n </noscript>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Backward-compatible aliases (from #59 GtmProvider)\n// ---------------------------------------------------------------------------\n\n/** @deprecated Use `AnalyticsStrategy` instead. */\nexport type GtmStrategy = AnalyticsStrategy;\n/** @deprecated Use `EcommerceEvent` instead. */\nexport type GtmEcommerceEvent = EcommerceEvent;\n/** @deprecated Use `EcommerceItem` instead. */\nexport type GtmItem = EcommerceItem;\n/** @deprecated Use `EcommerceParams` instead. */\nexport type GtmEcommerceParams = EcommerceParams;\n/** @deprecated Use `AnalyticsProviderProps` instead. */\nexport type GtmProviderProps = AnalyticsProviderProps;\n/** @deprecated Use `AnalyticsContextValue` instead. */\nexport type GtmContextValue = AnalyticsContextValue;\n/** @deprecated Use `AnalyticsNoscriptProps` instead. */\nexport type GtmNoscriptProps = AnalyticsNoscriptProps;\n\n/** @deprecated Use `AnalyticsProvider` instead. */\nexport const GtmProvider = AnalyticsProvider;\n/** @deprecated Use `useAnalytics` instead. */\nexport const useGtm = useAnalytics;\n/** @deprecated Use `AnalyticsNoscript` instead. */\nexport const GtmNoscript = AnalyticsNoscript;\n"],"mappings":"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","names":[]}
|
package/dist/gtm.cjs
CHANGED
|
@@ -1,145 +1,19 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
2
|
"use client";
|
|
3
3
|
|
|
4
|
-
// src/gtm.tsx
|
|
5
4
|
|
|
6
5
|
|
|
7
6
|
|
|
8
7
|
|
|
9
8
|
|
|
10
9
|
|
|
10
|
+
var _chunkECNNL5MUcjs = require('./chunk-ECNNL5MU.cjs');
|
|
11
11
|
|
|
12
|
-
var _react = require('react');
|
|
13
|
-
var _jsxruntime = require('react/jsx-runtime');
|
|
14
|
-
var AnalyticsContext = _react.createContext.call(void 0, null);
|
|
15
|
-
function getDataLayer() {
|
|
16
|
-
if (typeof window === "undefined") return [];
|
|
17
|
-
if (!window.dataLayer) window.dataLayer = [];
|
|
18
|
-
return window.dataLayer;
|
|
19
|
-
}
|
|
20
|
-
function injectGtmScript(gtmId, strategy) {
|
|
21
|
-
if (typeof document === "undefined") return;
|
|
22
|
-
if (document.getElementById("gtm-script")) return;
|
|
23
|
-
const dataLayer = getDataLayer();
|
|
24
|
-
dataLayer.push({ "gtm.start": (/* @__PURE__ */ new Date()).getTime(), event: "gtm.js" });
|
|
25
|
-
const script = document.createElement("script");
|
|
26
|
-
script.id = "gtm-script";
|
|
27
|
-
script.src = `https://www.googletagmanager.com/gtm.js?id=${encodeURIComponent(gtmId)}`;
|
|
28
|
-
if (strategy === "lazyOnload") {
|
|
29
|
-
script.async = true;
|
|
30
|
-
script.defer = true;
|
|
31
|
-
} else {
|
|
32
|
-
script.async = true;
|
|
33
|
-
}
|
|
34
|
-
document.head.appendChild(script);
|
|
35
|
-
}
|
|
36
|
-
function AnalyticsProvider({
|
|
37
|
-
gtmId,
|
|
38
|
-
strategy = "afterInteractive",
|
|
39
|
-
consentRequired = false,
|
|
40
|
-
debug = false,
|
|
41
|
-
children
|
|
42
|
-
}) {
|
|
43
|
-
const [hasConsent, setHasConsent] = _react.useState.call(void 0, !consentRequired);
|
|
44
|
-
const [isLoaded, setIsLoaded] = _react.useState.call(void 0, false);
|
|
45
|
-
const injectedRef = _react.useRef.call(void 0, false);
|
|
46
|
-
const loadGtm = _react.useCallback.call(void 0, () => {
|
|
47
|
-
if (injectedRef.current) return;
|
|
48
|
-
injectedRef.current = true;
|
|
49
|
-
if (strategy === "lazyOnload" && typeof requestIdleCallback === "function") {
|
|
50
|
-
requestIdleCallback(() => {
|
|
51
|
-
injectGtmScript(gtmId, strategy);
|
|
52
|
-
setIsLoaded(true);
|
|
53
|
-
});
|
|
54
|
-
} else if (strategy === "afterInteractive") {
|
|
55
|
-
setTimeout(() => {
|
|
56
|
-
injectGtmScript(gtmId, strategy);
|
|
57
|
-
setIsLoaded(true);
|
|
58
|
-
}, 0);
|
|
59
|
-
} else {
|
|
60
|
-
injectGtmScript(gtmId, strategy);
|
|
61
|
-
setIsLoaded(true);
|
|
62
|
-
}
|
|
63
|
-
}, [gtmId, strategy]);
|
|
64
|
-
if (hasConsent && !injectedRef.current && typeof window !== "undefined") {
|
|
65
|
-
loadGtm();
|
|
66
|
-
}
|
|
67
|
-
const trackEvent = _react.useCallback.call(void 0,
|
|
68
|
-
(event, params) => {
|
|
69
|
-
const entry = { event, ...params };
|
|
70
|
-
if (debug) {
|
|
71
|
-
console.log("[Analytics]", entry);
|
|
72
|
-
}
|
|
73
|
-
getDataLayer().push(entry);
|
|
74
|
-
},
|
|
75
|
-
[debug]
|
|
76
|
-
);
|
|
77
|
-
const trackEcommerceEvent = _react.useCallback.call(void 0,
|
|
78
|
-
(event, params) => {
|
|
79
|
-
getDataLayer().push({ ecommerce: null });
|
|
80
|
-
const entry = { event, ecommerce: params };
|
|
81
|
-
if (debug) {
|
|
82
|
-
console.log("[Analytics ecommerce]", entry);
|
|
83
|
-
}
|
|
84
|
-
getDataLayer().push(entry);
|
|
85
|
-
},
|
|
86
|
-
[debug]
|
|
87
|
-
);
|
|
88
|
-
const grantConsent = _react.useCallback.call(void 0, () => {
|
|
89
|
-
setHasConsent(true);
|
|
90
|
-
loadGtm();
|
|
91
|
-
}, [loadGtm]);
|
|
92
|
-
const revokeConsent = _react.useCallback.call(void 0, () => {
|
|
93
|
-
setHasConsent(false);
|
|
94
|
-
}, []);
|
|
95
|
-
const value = _react.useMemo.call(void 0,
|
|
96
|
-
() => ({
|
|
97
|
-
trackEvent,
|
|
98
|
-
trackEcommerceEvent,
|
|
99
|
-
grantConsent,
|
|
100
|
-
revokeConsent,
|
|
101
|
-
hasConsent,
|
|
102
|
-
isLoaded
|
|
103
|
-
}),
|
|
104
|
-
[
|
|
105
|
-
trackEvent,
|
|
106
|
-
trackEcommerceEvent,
|
|
107
|
-
grantConsent,
|
|
108
|
-
revokeConsent,
|
|
109
|
-
hasConsent,
|
|
110
|
-
isLoaded
|
|
111
|
-
]
|
|
112
|
-
);
|
|
113
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, AnalyticsContext.Provider, { value, children });
|
|
114
|
-
}
|
|
115
|
-
function useAnalytics() {
|
|
116
|
-
const context = _react.useContext.call(void 0, AnalyticsContext);
|
|
117
|
-
if (!context) {
|
|
118
|
-
throw new Error("useAnalytics must be used within an <AnalyticsProvider>");
|
|
119
|
-
}
|
|
120
|
-
return context;
|
|
121
|
-
}
|
|
122
|
-
function AnalyticsNoscript({ gtmId }) {
|
|
123
|
-
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "noscript", { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
124
|
-
"iframe",
|
|
125
|
-
{
|
|
126
|
-
src: `https://www.googletagmanager.com/ns.html?id=${encodeURIComponent(gtmId)}`,
|
|
127
|
-
height: "0",
|
|
128
|
-
width: "0",
|
|
129
|
-
style: { display: "none", visibility: "hidden" },
|
|
130
|
-
title: "Google Tag Manager"
|
|
131
|
-
}
|
|
132
|
-
) });
|
|
133
|
-
}
|
|
134
|
-
var GtmProvider = AnalyticsProvider;
|
|
135
|
-
var useGtm = useAnalytics;
|
|
136
|
-
var GtmNoscript = AnalyticsNoscript;
|
|
137
12
|
|
|
138
13
|
|
|
139
14
|
|
|
140
15
|
|
|
141
16
|
|
|
142
17
|
|
|
143
|
-
|
|
144
|
-
exports.AnalyticsNoscript = AnalyticsNoscript; exports.AnalyticsProvider = AnalyticsProvider; exports.GtmNoscript = GtmNoscript; exports.GtmProvider = GtmProvider; exports.useAnalytics = useAnalytics; exports.useGtm = useGtm;
|
|
18
|
+
exports.AnalyticsNoscript = _chunkECNNL5MUcjs.AnalyticsNoscript; exports.AnalyticsProvider = _chunkECNNL5MUcjs.AnalyticsProvider; exports.GtmNoscript = _chunkECNNL5MUcjs.GtmNoscript; exports.GtmProvider = _chunkECNNL5MUcjs.GtmProvider; exports.useAnalytics = _chunkECNNL5MUcjs.useAnalytics; exports.useGtm = _chunkECNNL5MUcjs.useGtm;
|
|
145
19
|
//# sourceMappingURL=gtm.cjs.map
|
package/dist/gtm.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/gtm.cjs","../src/gtm.tsx"],"names":[],"mappings":"AAAA,qFAAY;AACZ,YAAY;AACZ;AACA;ACDA;AACE;AACA;AACA;AACA;AACA;AACA;AAAA,8BACK;AAiOH,+CAAA;AA9IJ,IAAM,iBAAA,EAAmB,kCAAA,IAAgD,CAAA;AAYzE,SAAS,YAAA,CAAA,EAA0C;AAEjD,EAAA,GAAA,CAAI,OAAO,OAAA,IAAW,WAAA,EAAa,OAAO,CAAC,CAAA;AAC3C,EAAA,GAAA,CAAI,CAAC,MAAA,CAAO,SAAA,EAAW,MAAA,CAAO,UAAA,EAAY,CAAC,CAAA;AAC3C,EAAA,OAAO,MAAA,CAAO,SAAA;AAChB;AAEA,SAAS,eAAA,CACP,KAAA,EACA,QAAA,EACM;AAEN,EAAA,GAAA,CAAI,OAAO,SAAA,IAAa,WAAA,EAAa,MAAA;AAGrC,EAAA,GAAA,CAAI,QAAA,CAAS,cAAA,CAAe,YAAY,CAAA,EAAG,MAAA;AAE3C,EAAA,MAAM,UAAA,EAAY,YAAA,CAAa,CAAA;AAC/B,EAAA,SAAA,CAAU,IAAA,CAAK,EAAE,WAAA,EAAA,iBAAa,IAAI,IAAA,CAAK,CAAA,CAAA,CAAE,OAAA,CAAQ,CAAA,EAAG,KAAA,EAAO,SAAS,CAAC,CAAA;AAErE,EAAA,MAAM,OAAA,EAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,GAAA,EAAK,YAAA;AACZ,EAAA,MAAA,CAAO,IAAA,EAAM,CAAA,2CAAA,EAA8C,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAErD,EAAA;AACd,IAAA;AACA,IAAA;AACV,EAAA;AAEU,IAAA;AACjB,EAAA;AAEgC,EAAA;AAClC;AAMkC;AAChC,EAAA;AACW,EAAA;AACO,EAAA;AACV,EAAA;AACR,EAAA;AACyB;AACoC,EAAA;AACf,EAAA;AACd,EAAA;AAEE,EAAA;AACP,IAAA;AACH,IAAA;AAEsD,IAAA;AAChD,MAAA;AACO,QAAA;AACf,QAAA;AACjB,MAAA;AACyC,IAAA;AAEzB,MAAA;AACgB,QAAA;AACf,QAAA;AACd,MAAA;AACC,IAAA;AAC0B,MAAA;AACf,MAAA;AAClB,IAAA;AACkB,EAAA;AAIqD,EAAA;AAC/D,IAAA;AACV,EAAA;AAEmB,EAAA;AACoC,IAAA;AAClB,MAAA;AACtB,MAAA;AACuB,QAAA;AAClC,MAAA;AACyB,MAAA;AAC3B,IAAA;AACM,IAAA;AACR,EAAA;AAE4B,EAAA;AAC0B,IAAA;AAEX,MAAA;AACE,MAAA;AAC9B,MAAA;AACiC,QAAA;AAC5C,MAAA;AACyB,MAAA;AAC3B,IAAA;AACM,IAAA;AACR,EAAA;AAEuC,EAAA;AACnB,IAAA;AACV,IAAA;AACE,EAAA;AAE4B,EAAA;AACnB,IAAA;AAChB,EAAA;AAES,EAAA;AACL,IAAA;AACL,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACA,IAAA;AACE,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACF,IAAA;AACF,EAAA;AAKE,EAAA;AAEJ;AAMsD;AACT,EAAA;AAC7B,EAAA;AAC6D,IAAA;AAC3E,EAAA;AACO,EAAA;AACT;AAWqE;AAG/D,EAAA;AAAC,IAAA;AAAA,IAAA;AAC8E,MAAA;AACtE,MAAA;AACD,MAAA;AACyC,MAAA;AACzC,MAAA;AAAA,IAAA;AAEV,EAAA;AAEJ;AAsB2B;AAEL;AAEK;ADnK4D;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/gtm.cjs","sourcesContent":[null,"\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ReactNode } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Script loading strategy. */\nexport type AnalyticsStrategy = \"default\" | \"afterInteractive\" | \"lazyOnload\";\n\n/** GA4 standard e-commerce event names. */\nexport type EcommerceEvent =\n | \"view_item\"\n | \"view_item_list\"\n | \"select_item\"\n | \"add_to_cart\"\n | \"remove_from_cart\"\n | \"view_cart\"\n | \"begin_checkout\"\n | \"add_shipping_info\"\n | \"add_payment_info\"\n | \"purchase\"\n | \"refund\";\n\n/** GA4 e-commerce item shape. */\nexport interface EcommerceItem {\n item_id: string;\n item_name?: string;\n item_brand?: string;\n item_category?: string;\n item_variant?: string;\n price?: number;\n quantity?: number;\n index?: number;\n [key: string]: unknown;\n}\n\n/** Parameters for e-commerce events. */\nexport interface EcommerceParams {\n currency?: string;\n value?: number;\n items?: EcommerceItem[];\n transaction_id?: string;\n shipping?: number;\n tax?: number;\n coupon?: string;\n [key: string]: unknown;\n}\n\nexport interface AnalyticsProviderProps {\n /** GTM container ID (e.g. \"GTM-XXXXX\"). */\n gtmId: string;\n /** Script loading strategy. Default: \"afterInteractive\". */\n strategy?: AnalyticsStrategy;\n /** Delay GTM loading until consent is granted. Default: false. */\n consentRequired?: boolean;\n /** Log dataLayer pushes to console. Default: false. */\n debug?: boolean;\n children: ReactNode;\n}\n\nexport interface AnalyticsContextValue {\n /** Push a custom event to the dataLayer. */\n trackEvent: (event: string, params?: Record<string, unknown>) => void;\n /** Push a GA4 e-commerce event to the dataLayer. */\n trackEcommerceEvent: (\n event: EcommerceEvent,\n params: EcommerceParams,\n ) => void;\n /** Grant consent — loads GTM if consentRequired was true. */\n grantConsent: () => void;\n /** Revoke consent. Does not unload GTM (scripts can't be unloaded). */\n revokeConsent: () => void;\n /** Whether consent has been granted. */\n hasConsent: boolean;\n /** Whether the GTM script has been injected. */\n isLoaded: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nconst AnalyticsContext = createContext<AnalyticsContextValue | null>(null);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ndeclare global {\n interface Window {\n dataLayer?: Record<string, unknown>[];\n }\n}\n\nfunction getDataLayer(): Record<string, unknown>[] {\n /* v8 ignore next */\n if (typeof window === \"undefined\") return [];\n if (!window.dataLayer) window.dataLayer = [];\n return window.dataLayer;\n}\n\nfunction injectGtmScript(\n gtmId: string,\n strategy: AnalyticsStrategy,\n): void {\n /* v8 ignore next */\n if (typeof document === \"undefined\") return;\n\n // Prevent double-injection\n if (document.getElementById(\"gtm-script\")) return;\n\n const dataLayer = getDataLayer();\n dataLayer.push({ \"gtm.start\": new Date().getTime(), event: \"gtm.js\" });\n\n const script = document.createElement(\"script\");\n script.id = \"gtm-script\";\n script.src = `https://www.googletagmanager.com/gtm.js?id=${encodeURIComponent(gtmId)}`;\n\n if (strategy === \"lazyOnload\") {\n script.async = true;\n script.defer = true;\n } else {\n // \"default\" and \"afterInteractive\"\n script.async = true;\n }\n\n document.head.appendChild(script);\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport function AnalyticsProvider({\n gtmId,\n strategy = \"afterInteractive\",\n consentRequired = false,\n debug = false,\n children,\n}: AnalyticsProviderProps) {\n const [hasConsent, setHasConsent] = useState(!consentRequired);\n const [isLoaded, setIsLoaded] = useState(false);\n const injectedRef = useRef(false);\n\n const loadGtm = useCallback(() => {\n if (injectedRef.current) return;\n injectedRef.current = true;\n\n if (strategy === \"lazyOnload\" && typeof requestIdleCallback === \"function\") {\n requestIdleCallback(() => {\n injectGtmScript(gtmId, strategy);\n setIsLoaded(true);\n });\n } else if (strategy === \"afterInteractive\") {\n // Defer to after hydration\n setTimeout(() => {\n injectGtmScript(gtmId, strategy);\n setIsLoaded(true);\n }, 0);\n } else {\n injectGtmScript(gtmId, strategy);\n setIsLoaded(true);\n }\n }, [gtmId, strategy]);\n\n // Auto-load when consent is not required or already granted\n /* v8 ignore next */\n if (hasConsent && !injectedRef.current && typeof window !== \"undefined\") {\n loadGtm();\n }\n\n const trackEvent = useCallback(\n (event: string, params?: Record<string, unknown>) => {\n const entry = { event, ...params };\n if (debug) {\n console.log(\"[Analytics]\", entry);\n }\n getDataLayer().push(entry);\n },\n [debug],\n );\n\n const trackEcommerceEvent = useCallback(\n (event: EcommerceEvent, params: EcommerceParams) => {\n // Clear previous ecommerce data per GA4 best practices\n getDataLayer().push({ ecommerce: null });\n const entry = { event, ecommerce: params };\n if (debug) {\n console.log(\"[Analytics ecommerce]\", entry);\n }\n getDataLayer().push(entry);\n },\n [debug],\n );\n\n const grantConsent = useCallback(() => {\n setHasConsent(true);\n loadGtm();\n }, [loadGtm]);\n\n const revokeConsent = useCallback(() => {\n setHasConsent(false);\n }, []);\n\n const value = useMemo<AnalyticsContextValue>(\n () => ({\n trackEvent,\n trackEcommerceEvent,\n grantConsent,\n revokeConsent,\n hasConsent,\n isLoaded,\n }),\n [\n trackEvent,\n trackEcommerceEvent,\n grantConsent,\n revokeConsent,\n hasConsent,\n isLoaded,\n ],\n );\n\n return (\n <AnalyticsContext.Provider value={value}>\n {children}\n </AnalyticsContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useAnalytics(): AnalyticsContextValue {\n const context = useContext(AnalyticsContext);\n if (!context) {\n throw new Error(\"useAnalytics must be used within an <AnalyticsProvider>\");\n }\n return context;\n}\n\n// ---------------------------------------------------------------------------\n// Noscript\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsNoscriptProps {\n /** GTM container ID (must match AnalyticsProvider). */\n gtmId: string;\n}\n\nexport function AnalyticsNoscript({ gtmId }: AnalyticsNoscriptProps) {\n return (\n <noscript>\n <iframe\n src={`https://www.googletagmanager.com/ns.html?id=${encodeURIComponent(gtmId)}`}\n height=\"0\"\n width=\"0\"\n style={{ display: \"none\", visibility: \"hidden\" }}\n title=\"Google Tag Manager\"\n />\n </noscript>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Backward-compatible aliases (from #59 GtmProvider)\n// ---------------------------------------------------------------------------\n\n/** @deprecated Use `AnalyticsStrategy` instead. */\nexport type GtmStrategy = AnalyticsStrategy;\n/** @deprecated Use `EcommerceEvent` instead. */\nexport type GtmEcommerceEvent = EcommerceEvent;\n/** @deprecated Use `EcommerceItem` instead. */\nexport type GtmItem = EcommerceItem;\n/** @deprecated Use `EcommerceParams` instead. */\nexport type GtmEcommerceParams = EcommerceParams;\n/** @deprecated Use `AnalyticsProviderProps` instead. */\nexport type GtmProviderProps = AnalyticsProviderProps;\n/** @deprecated Use `AnalyticsContextValue` instead. */\nexport type GtmContextValue = AnalyticsContextValue;\n/** @deprecated Use `AnalyticsNoscriptProps` instead. */\nexport type GtmNoscriptProps = AnalyticsNoscriptProps;\n\n/** @deprecated Use `AnalyticsProvider` instead. */\nexport const GtmProvider = AnalyticsProvider;\n/** @deprecated Use `useAnalytics` instead. */\nexport const useGtm = useAnalytics;\n/** @deprecated Use `AnalyticsNoscript` instead. */\nexport const GtmNoscript = AnalyticsNoscript;\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/gtm.cjs"],"names":[],"mappings":"AAAA,qFAAY;AACZ,YAAY;AACZ;AACE;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACF,6UAAC","file":"/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/gtm.cjs"}
|
package/dist/gtm.js
CHANGED
|
@@ -1,139 +1,13 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
"use client";
|
|
3
|
-
|
|
4
|
-
// src/gtm.tsx
|
|
5
3
|
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
} from "
|
|
13
|
-
import { jsx } from "react/jsx-runtime";
|
|
14
|
-
var AnalyticsContext = createContext(null);
|
|
15
|
-
function getDataLayer() {
|
|
16
|
-
if (typeof window === "undefined") return [];
|
|
17
|
-
if (!window.dataLayer) window.dataLayer = [];
|
|
18
|
-
return window.dataLayer;
|
|
19
|
-
}
|
|
20
|
-
function injectGtmScript(gtmId, strategy) {
|
|
21
|
-
if (typeof document === "undefined") return;
|
|
22
|
-
if (document.getElementById("gtm-script")) return;
|
|
23
|
-
const dataLayer = getDataLayer();
|
|
24
|
-
dataLayer.push({ "gtm.start": (/* @__PURE__ */ new Date()).getTime(), event: "gtm.js" });
|
|
25
|
-
const script = document.createElement("script");
|
|
26
|
-
script.id = "gtm-script";
|
|
27
|
-
script.src = `https://www.googletagmanager.com/gtm.js?id=${encodeURIComponent(gtmId)}`;
|
|
28
|
-
if (strategy === "lazyOnload") {
|
|
29
|
-
script.async = true;
|
|
30
|
-
script.defer = true;
|
|
31
|
-
} else {
|
|
32
|
-
script.async = true;
|
|
33
|
-
}
|
|
34
|
-
document.head.appendChild(script);
|
|
35
|
-
}
|
|
36
|
-
function AnalyticsProvider({
|
|
37
|
-
gtmId,
|
|
38
|
-
strategy = "afterInteractive",
|
|
39
|
-
consentRequired = false,
|
|
40
|
-
debug = false,
|
|
41
|
-
children
|
|
42
|
-
}) {
|
|
43
|
-
const [hasConsent, setHasConsent] = useState(!consentRequired);
|
|
44
|
-
const [isLoaded, setIsLoaded] = useState(false);
|
|
45
|
-
const injectedRef = useRef(false);
|
|
46
|
-
const loadGtm = useCallback(() => {
|
|
47
|
-
if (injectedRef.current) return;
|
|
48
|
-
injectedRef.current = true;
|
|
49
|
-
if (strategy === "lazyOnload" && typeof requestIdleCallback === "function") {
|
|
50
|
-
requestIdleCallback(() => {
|
|
51
|
-
injectGtmScript(gtmId, strategy);
|
|
52
|
-
setIsLoaded(true);
|
|
53
|
-
});
|
|
54
|
-
} else if (strategy === "afterInteractive") {
|
|
55
|
-
setTimeout(() => {
|
|
56
|
-
injectGtmScript(gtmId, strategy);
|
|
57
|
-
setIsLoaded(true);
|
|
58
|
-
}, 0);
|
|
59
|
-
} else {
|
|
60
|
-
injectGtmScript(gtmId, strategy);
|
|
61
|
-
setIsLoaded(true);
|
|
62
|
-
}
|
|
63
|
-
}, [gtmId, strategy]);
|
|
64
|
-
if (hasConsent && !injectedRef.current && typeof window !== "undefined") {
|
|
65
|
-
loadGtm();
|
|
66
|
-
}
|
|
67
|
-
const trackEvent = useCallback(
|
|
68
|
-
(event, params) => {
|
|
69
|
-
const entry = { event, ...params };
|
|
70
|
-
if (debug) {
|
|
71
|
-
console.log("[Analytics]", entry);
|
|
72
|
-
}
|
|
73
|
-
getDataLayer().push(entry);
|
|
74
|
-
},
|
|
75
|
-
[debug]
|
|
76
|
-
);
|
|
77
|
-
const trackEcommerceEvent = useCallback(
|
|
78
|
-
(event, params) => {
|
|
79
|
-
getDataLayer().push({ ecommerce: null });
|
|
80
|
-
const entry = { event, ecommerce: params };
|
|
81
|
-
if (debug) {
|
|
82
|
-
console.log("[Analytics ecommerce]", entry);
|
|
83
|
-
}
|
|
84
|
-
getDataLayer().push(entry);
|
|
85
|
-
},
|
|
86
|
-
[debug]
|
|
87
|
-
);
|
|
88
|
-
const grantConsent = useCallback(() => {
|
|
89
|
-
setHasConsent(true);
|
|
90
|
-
loadGtm();
|
|
91
|
-
}, [loadGtm]);
|
|
92
|
-
const revokeConsent = useCallback(() => {
|
|
93
|
-
setHasConsent(false);
|
|
94
|
-
}, []);
|
|
95
|
-
const value = useMemo(
|
|
96
|
-
() => ({
|
|
97
|
-
trackEvent,
|
|
98
|
-
trackEcommerceEvent,
|
|
99
|
-
grantConsent,
|
|
100
|
-
revokeConsent,
|
|
101
|
-
hasConsent,
|
|
102
|
-
isLoaded
|
|
103
|
-
}),
|
|
104
|
-
[
|
|
105
|
-
trackEvent,
|
|
106
|
-
trackEcommerceEvent,
|
|
107
|
-
grantConsent,
|
|
108
|
-
revokeConsent,
|
|
109
|
-
hasConsent,
|
|
110
|
-
isLoaded
|
|
111
|
-
]
|
|
112
|
-
);
|
|
113
|
-
return /* @__PURE__ */ jsx(AnalyticsContext.Provider, { value, children });
|
|
114
|
-
}
|
|
115
|
-
function useAnalytics() {
|
|
116
|
-
const context = useContext(AnalyticsContext);
|
|
117
|
-
if (!context) {
|
|
118
|
-
throw new Error("useAnalytics must be used within an <AnalyticsProvider>");
|
|
119
|
-
}
|
|
120
|
-
return context;
|
|
121
|
-
}
|
|
122
|
-
function AnalyticsNoscript({ gtmId }) {
|
|
123
|
-
return /* @__PURE__ */ jsx("noscript", { children: /* @__PURE__ */ jsx(
|
|
124
|
-
"iframe",
|
|
125
|
-
{
|
|
126
|
-
src: `https://www.googletagmanager.com/ns.html?id=${encodeURIComponent(gtmId)}`,
|
|
127
|
-
height: "0",
|
|
128
|
-
width: "0",
|
|
129
|
-
style: { display: "none", visibility: "hidden" },
|
|
130
|
-
title: "Google Tag Manager"
|
|
131
|
-
}
|
|
132
|
-
) });
|
|
133
|
-
}
|
|
134
|
-
var GtmProvider = AnalyticsProvider;
|
|
135
|
-
var useGtm = useAnalytics;
|
|
136
|
-
var GtmNoscript = AnalyticsNoscript;
|
|
4
|
+
AnalyticsNoscript,
|
|
5
|
+
AnalyticsProvider,
|
|
6
|
+
GtmNoscript,
|
|
7
|
+
GtmProvider,
|
|
8
|
+
useAnalytics,
|
|
9
|
+
useGtm
|
|
10
|
+
} from "./chunk-YR2SJWTF.js";
|
|
137
11
|
export {
|
|
138
12
|
AnalyticsNoscript,
|
|
139
13
|
AnalyticsProvider,
|
package/dist/gtm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/gtm.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type { ReactNode } from \"react\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/** Script loading strategy. */\nexport type AnalyticsStrategy = \"default\" | \"afterInteractive\" | \"lazyOnload\";\n\n/** GA4 standard e-commerce event names. */\nexport type EcommerceEvent =\n | \"view_item\"\n | \"view_item_list\"\n | \"select_item\"\n | \"add_to_cart\"\n | \"remove_from_cart\"\n | \"view_cart\"\n | \"begin_checkout\"\n | \"add_shipping_info\"\n | \"add_payment_info\"\n | \"purchase\"\n | \"refund\";\n\n/** GA4 e-commerce item shape. */\nexport interface EcommerceItem {\n item_id: string;\n item_name?: string;\n item_brand?: string;\n item_category?: string;\n item_variant?: string;\n price?: number;\n quantity?: number;\n index?: number;\n [key: string]: unknown;\n}\n\n/** Parameters for e-commerce events. */\nexport interface EcommerceParams {\n currency?: string;\n value?: number;\n items?: EcommerceItem[];\n transaction_id?: string;\n shipping?: number;\n tax?: number;\n coupon?: string;\n [key: string]: unknown;\n}\n\nexport interface AnalyticsProviderProps {\n /** GTM container ID (e.g. \"GTM-XXXXX\"). */\n gtmId: string;\n /** Script loading strategy. Default: \"afterInteractive\". */\n strategy?: AnalyticsStrategy;\n /** Delay GTM loading until consent is granted. Default: false. */\n consentRequired?: boolean;\n /** Log dataLayer pushes to console. Default: false. */\n debug?: boolean;\n children: ReactNode;\n}\n\nexport interface AnalyticsContextValue {\n /** Push a custom event to the dataLayer. */\n trackEvent: (event: string, params?: Record<string, unknown>) => void;\n /** Push a GA4 e-commerce event to the dataLayer. */\n trackEcommerceEvent: (\n event: EcommerceEvent,\n params: EcommerceParams,\n ) => void;\n /** Grant consent — loads GTM if consentRequired was true. */\n grantConsent: () => void;\n /** Revoke consent. Does not unload GTM (scripts can't be unloaded). */\n revokeConsent: () => void;\n /** Whether consent has been granted. */\n hasConsent: boolean;\n /** Whether the GTM script has been injected. */\n isLoaded: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nconst AnalyticsContext = createContext<AnalyticsContextValue | null>(null);\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\ndeclare global {\n interface Window {\n dataLayer?: Record<string, unknown>[];\n }\n}\n\nfunction getDataLayer(): Record<string, unknown>[] {\n /* v8 ignore next */\n if (typeof window === \"undefined\") return [];\n if (!window.dataLayer) window.dataLayer = [];\n return window.dataLayer;\n}\n\nfunction injectGtmScript(\n gtmId: string,\n strategy: AnalyticsStrategy,\n): void {\n /* v8 ignore next */\n if (typeof document === \"undefined\") return;\n\n // Prevent double-injection\n if (document.getElementById(\"gtm-script\")) return;\n\n const dataLayer = getDataLayer();\n dataLayer.push({ \"gtm.start\": new Date().getTime(), event: \"gtm.js\" });\n\n const script = document.createElement(\"script\");\n script.id = \"gtm-script\";\n script.src = `https://www.googletagmanager.com/gtm.js?id=${encodeURIComponent(gtmId)}`;\n\n if (strategy === \"lazyOnload\") {\n script.async = true;\n script.defer = true;\n } else {\n // \"default\" and \"afterInteractive\"\n script.async = true;\n }\n\n document.head.appendChild(script);\n}\n\n// ---------------------------------------------------------------------------\n// Provider\n// ---------------------------------------------------------------------------\n\nexport function AnalyticsProvider({\n gtmId,\n strategy = \"afterInteractive\",\n consentRequired = false,\n debug = false,\n children,\n}: AnalyticsProviderProps) {\n const [hasConsent, setHasConsent] = useState(!consentRequired);\n const [isLoaded, setIsLoaded] = useState(false);\n const injectedRef = useRef(false);\n\n const loadGtm = useCallback(() => {\n if (injectedRef.current) return;\n injectedRef.current = true;\n\n if (strategy === \"lazyOnload\" && typeof requestIdleCallback === \"function\") {\n requestIdleCallback(() => {\n injectGtmScript(gtmId, strategy);\n setIsLoaded(true);\n });\n } else if (strategy === \"afterInteractive\") {\n // Defer to after hydration\n setTimeout(() => {\n injectGtmScript(gtmId, strategy);\n setIsLoaded(true);\n }, 0);\n } else {\n injectGtmScript(gtmId, strategy);\n setIsLoaded(true);\n }\n }, [gtmId, strategy]);\n\n // Auto-load when consent is not required or already granted\n /* v8 ignore next */\n if (hasConsent && !injectedRef.current && typeof window !== \"undefined\") {\n loadGtm();\n }\n\n const trackEvent = useCallback(\n (event: string, params?: Record<string, unknown>) => {\n const entry = { event, ...params };\n if (debug) {\n console.log(\"[Analytics]\", entry);\n }\n getDataLayer().push(entry);\n },\n [debug],\n );\n\n const trackEcommerceEvent = useCallback(\n (event: EcommerceEvent, params: EcommerceParams) => {\n // Clear previous ecommerce data per GA4 best practices\n getDataLayer().push({ ecommerce: null });\n const entry = { event, ecommerce: params };\n if (debug) {\n console.log(\"[Analytics ecommerce]\", entry);\n }\n getDataLayer().push(entry);\n },\n [debug],\n );\n\n const grantConsent = useCallback(() => {\n setHasConsent(true);\n loadGtm();\n }, [loadGtm]);\n\n const revokeConsent = useCallback(() => {\n setHasConsent(false);\n }, []);\n\n const value = useMemo<AnalyticsContextValue>(\n () => ({\n trackEvent,\n trackEcommerceEvent,\n grantConsent,\n revokeConsent,\n hasConsent,\n isLoaded,\n }),\n [\n trackEvent,\n trackEcommerceEvent,\n grantConsent,\n revokeConsent,\n hasConsent,\n isLoaded,\n ],\n );\n\n return (\n <AnalyticsContext.Provider value={value}>\n {children}\n </AnalyticsContext.Provider>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useAnalytics(): AnalyticsContextValue {\n const context = useContext(AnalyticsContext);\n if (!context) {\n throw new Error(\"useAnalytics must be used within an <AnalyticsProvider>\");\n }\n return context;\n}\n\n// ---------------------------------------------------------------------------\n// Noscript\n// ---------------------------------------------------------------------------\n\nexport interface AnalyticsNoscriptProps {\n /** GTM container ID (must match AnalyticsProvider). */\n gtmId: string;\n}\n\nexport function AnalyticsNoscript({ gtmId }: AnalyticsNoscriptProps) {\n return (\n <noscript>\n <iframe\n src={`https://www.googletagmanager.com/ns.html?id=${encodeURIComponent(gtmId)}`}\n height=\"0\"\n width=\"0\"\n style={{ display: \"none\", visibility: \"hidden\" }}\n title=\"Google Tag Manager\"\n />\n </noscript>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Backward-compatible aliases (from #59 GtmProvider)\n// ---------------------------------------------------------------------------\n\n/** @deprecated Use `AnalyticsStrategy` instead. */\nexport type GtmStrategy = AnalyticsStrategy;\n/** @deprecated Use `EcommerceEvent` instead. */\nexport type GtmEcommerceEvent = EcommerceEvent;\n/** @deprecated Use `EcommerceItem` instead. */\nexport type GtmItem = EcommerceItem;\n/** @deprecated Use `EcommerceParams` instead. */\nexport type GtmEcommerceParams = EcommerceParams;\n/** @deprecated Use `AnalyticsProviderProps` instead. */\nexport type GtmProviderProps = AnalyticsProviderProps;\n/** @deprecated Use `AnalyticsContextValue` instead. */\nexport type GtmContextValue = AnalyticsContextValue;\n/** @deprecated Use `AnalyticsNoscriptProps` instead. */\nexport type GtmNoscriptProps = AnalyticsNoscriptProps;\n\n/** @deprecated Use `AnalyticsProvider` instead. */\nexport const GtmProvider = AnalyticsProvider;\n/** @deprecated Use `useAnalytics` instead. */\nexport const useGtm = useAnalytics;\n/** @deprecated Use `AnalyticsNoscript` instead. */\nexport const GtmNoscript = AnalyticsNoscript;\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
var _chunkECNNL5MUcjs = require('./chunk-ECNNL5MU.cjs');
|
|
5
|
+
|
|
6
|
+
// src/provider.tsx
|
|
7
|
+
var _augurhooks = require('@simpleapps-com/augur-hooks');
|
|
8
|
+
var _jsxruntime = require('react/jsx-runtime');
|
|
9
|
+
function AugurSiteProvider({
|
|
10
|
+
config,
|
|
11
|
+
api,
|
|
12
|
+
auth,
|
|
13
|
+
callbacks,
|
|
14
|
+
cache,
|
|
15
|
+
children
|
|
16
|
+
}) {
|
|
17
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _augurhooks.AugurHooksProvider, { api, auth, callbacks, cache, site: config, children: config.analytics ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
18
|
+
_chunkECNNL5MUcjs.AnalyticsProvider,
|
|
19
|
+
{
|
|
20
|
+
gtmId: config.analytics.gtmId,
|
|
21
|
+
consentRequired: config.analytics.consentRequired,
|
|
22
|
+
strategy: config.analytics.strategy,
|
|
23
|
+
debug: config.analytics.debug,
|
|
24
|
+
children
|
|
25
|
+
}
|
|
26
|
+
) : children });
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
exports.AugurSiteProvider = AugurSiteProvider;
|
|
31
|
+
//# sourceMappingURL=provider.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/provider.cjs","../src/provider.tsx"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA,yDAAmC;AAwC3B,+CAAA;AAXD,SAAS,iBAAA,CAAkB;AAAA,EAChC,MAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,uBACE,6BAAA,8BAAC,EAAA,EAAmB,GAAA,EAAU,IAAA,EAAY,SAAA,EAAsB,KAAA,EAAc,IAAA,EAAM,MAAA,EACjF,QAAA,EAAA,MAAA,CAAO,UAAA,kBACN,6BAAA;AAAA,IAAC,mCAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAO,MAAA,CAAO,SAAA,CAAU,KAAA;AAAA,MACxB,eAAA,EAAiB,MAAA,CAAO,SAAA,CAAU,eAAA;AAAA,MAClC,QAAA,EAAU,MAAA,CAAO,SAAA,CAAU,QAAA;AAAA,MAC3B,KAAA,EAAO,MAAA,CAAO,SAAA,CAAU,KAAA;AAAA,MAEvB;AAAA,IAAA;AAAA,EACH,EAAA,EAEA,SAAA,CAEJ,CAAA;AAEJ;AD3BA;AACE;AACF,8CAAC","file":"/home/runner/work/augur-packages/augur-packages/packages/augur-web/dist/provider.cjs","sourcesContent":[null,"import React, { type ReactNode } from \"react\";\nimport { AugurHooksProvider } from \"@simpleapps-com/augur-hooks\";\nimport type { AugurSiteConfig, AugurAuthContext, CacheConfig } from \"@simpleapps-com/augur-core\";\nimport type { AugurCallbacks } from \"@simpleapps-com/augur-hooks\";\nimport { AnalyticsProvider } from \"./gtm\";\n\nexport interface AugurSiteProviderProps {\n /** Site configuration created with `defineSite()`. */\n config: AugurSiteConfig;\n /** SDK client instance. */\n api?: unknown;\n /** Auth context (NextAuth, Clerk, etc.). */\n auth?: AugurAuthContext;\n /** Callback registry for server action overrides. */\n callbacks?: AugurCallbacks;\n /** Cache configuration (edge/Redis). */\n cache?: CacheConfig;\n children: ReactNode;\n}\n\n/**\n * Unified site provider that composes AugurHooksProvider with analytics\n * based on the site config.\n *\n * ```tsx\n * <AugurSiteProvider config={siteConfig} api={api} auth={auth}>\n * {children}\n * </AugurSiteProvider>\n * ```\n */\nexport function AugurSiteProvider({\n config,\n api,\n auth,\n callbacks,\n cache,\n children,\n}: AugurSiteProviderProps) {\n return (\n <AugurHooksProvider api={api} auth={auth} callbacks={callbacks} cache={cache} site={config}>\n {config.analytics ? (\n <AnalyticsProvider\n gtmId={config.analytics.gtmId}\n consentRequired={config.analytics.consentRequired}\n strategy={config.analytics.strategy}\n debug={config.analytics.debug}\n >\n {children}\n </AnalyticsProvider>\n ) : (\n children\n )}\n </AugurHooksProvider>\n );\n}\n"]}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { AugurSiteConfig, AugurAuthContext, CacheConfig } from '@simpleapps-com/augur-core';
|
|
4
|
+
import { AugurCallbacks } from '@simpleapps-com/augur-hooks';
|
|
5
|
+
|
|
6
|
+
interface AugurSiteProviderProps {
|
|
7
|
+
/** Site configuration created with `defineSite()`. */
|
|
8
|
+
config: AugurSiteConfig;
|
|
9
|
+
/** SDK client instance. */
|
|
10
|
+
api?: unknown;
|
|
11
|
+
/** Auth context (NextAuth, Clerk, etc.). */
|
|
12
|
+
auth?: AugurAuthContext;
|
|
13
|
+
/** Callback registry for server action overrides. */
|
|
14
|
+
callbacks?: AugurCallbacks;
|
|
15
|
+
/** Cache configuration (edge/Redis). */
|
|
16
|
+
cache?: CacheConfig;
|
|
17
|
+
children: ReactNode;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Unified site provider that composes AugurHooksProvider with analytics
|
|
21
|
+
* based on the site config.
|
|
22
|
+
*
|
|
23
|
+
* ```tsx
|
|
24
|
+
* <AugurSiteProvider config={siteConfig} api={api} auth={auth}>
|
|
25
|
+
* {children}
|
|
26
|
+
* </AugurSiteProvider>
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
declare function AugurSiteProvider({ config, api, auth, callbacks, cache, children, }: AugurSiteProviderProps): react_jsx_runtime.JSX.Element;
|
|
30
|
+
|
|
31
|
+
export { AugurSiteProvider, type AugurSiteProviderProps };
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { AugurSiteConfig, AugurAuthContext, CacheConfig } from '@simpleapps-com/augur-core';
|
|
4
|
+
import { AugurCallbacks } from '@simpleapps-com/augur-hooks';
|
|
5
|
+
|
|
6
|
+
interface AugurSiteProviderProps {
|
|
7
|
+
/** Site configuration created with `defineSite()`. */
|
|
8
|
+
config: AugurSiteConfig;
|
|
9
|
+
/** SDK client instance. */
|
|
10
|
+
api?: unknown;
|
|
11
|
+
/** Auth context (NextAuth, Clerk, etc.). */
|
|
12
|
+
auth?: AugurAuthContext;
|
|
13
|
+
/** Callback registry for server action overrides. */
|
|
14
|
+
callbacks?: AugurCallbacks;
|
|
15
|
+
/** Cache configuration (edge/Redis). */
|
|
16
|
+
cache?: CacheConfig;
|
|
17
|
+
children: ReactNode;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Unified site provider that composes AugurHooksProvider with analytics
|
|
21
|
+
* based on the site config.
|
|
22
|
+
*
|
|
23
|
+
* ```tsx
|
|
24
|
+
* <AugurSiteProvider config={siteConfig} api={api} auth={auth}>
|
|
25
|
+
* {children}
|
|
26
|
+
* </AugurSiteProvider>
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
declare function AugurSiteProvider({ config, api, auth, callbacks, cache, children, }: AugurSiteProviderProps): react_jsx_runtime.JSX.Element;
|
|
30
|
+
|
|
31
|
+
export { AugurSiteProvider, type AugurSiteProviderProps };
|
package/dist/provider.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import {
|
|
3
|
+
AnalyticsProvider
|
|
4
|
+
} from "./chunk-YR2SJWTF.js";
|
|
5
|
+
|
|
6
|
+
// src/provider.tsx
|
|
7
|
+
import { AugurHooksProvider } from "@simpleapps-com/augur-hooks";
|
|
8
|
+
import { jsx } from "react/jsx-runtime";
|
|
9
|
+
function AugurSiteProvider({
|
|
10
|
+
config,
|
|
11
|
+
api,
|
|
12
|
+
auth,
|
|
13
|
+
callbacks,
|
|
14
|
+
cache,
|
|
15
|
+
children
|
|
16
|
+
}) {
|
|
17
|
+
return /* @__PURE__ */ jsx(AugurHooksProvider, { api, auth, callbacks, cache, site: config, children: config.analytics ? /* @__PURE__ */ jsx(
|
|
18
|
+
AnalyticsProvider,
|
|
19
|
+
{
|
|
20
|
+
gtmId: config.analytics.gtmId,
|
|
21
|
+
consentRequired: config.analytics.consentRequired,
|
|
22
|
+
strategy: config.analytics.strategy,
|
|
23
|
+
debug: config.analytics.debug,
|
|
24
|
+
children
|
|
25
|
+
}
|
|
26
|
+
) : children });
|
|
27
|
+
}
|
|
28
|
+
export {
|
|
29
|
+
AugurSiteProvider
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/provider.tsx"],"sourcesContent":["import React, { type ReactNode } from \"react\";\nimport { AugurHooksProvider } from \"@simpleapps-com/augur-hooks\";\nimport type { AugurSiteConfig, AugurAuthContext, CacheConfig } from \"@simpleapps-com/augur-core\";\nimport type { AugurCallbacks } from \"@simpleapps-com/augur-hooks\";\nimport { AnalyticsProvider } from \"./gtm\";\n\nexport interface AugurSiteProviderProps {\n /** Site configuration created with `defineSite()`. */\n config: AugurSiteConfig;\n /** SDK client instance. */\n api?: unknown;\n /** Auth context (NextAuth, Clerk, etc.). */\n auth?: AugurAuthContext;\n /** Callback registry for server action overrides. */\n callbacks?: AugurCallbacks;\n /** Cache configuration (edge/Redis). */\n cache?: CacheConfig;\n children: ReactNode;\n}\n\n/**\n * Unified site provider that composes AugurHooksProvider with analytics\n * based on the site config.\n *\n * ```tsx\n * <AugurSiteProvider config={siteConfig} api={api} auth={auth}>\n * {children}\n * </AugurSiteProvider>\n * ```\n */\nexport function AugurSiteProvider({\n config,\n api,\n auth,\n callbacks,\n cache,\n children,\n}: AugurSiteProviderProps) {\n return (\n <AugurHooksProvider api={api} auth={auth} callbacks={callbacks} cache={cache} site={config}>\n {config.analytics ? (\n <AnalyticsProvider\n gtmId={config.analytics.gtmId}\n consentRequired={config.analytics.consentRequired}\n strategy={config.analytics.strategy}\n debug={config.analytics.debug}\n >\n {children}\n </AnalyticsProvider>\n ) : (\n children\n )}\n </AugurHooksProvider>\n );\n}\n"],"mappings":";;;;;;AACA,SAAS,0BAA0B;AAwC3B;AAXD,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,SACE,oBAAC,sBAAmB,KAAU,MAAY,WAAsB,OAAc,MAAM,QACjF,iBAAO,YACN;AAAA,IAAC;AAAA;AAAA,MACC,OAAO,OAAO,UAAU;AAAA,MACxB,iBAAiB,OAAO,UAAU;AAAA,MAClC,UAAU,OAAO,UAAU;AAAA,MAC3B,OAAO,OAAO,UAAU;AAAA,MAEvB;AAAA;AAAA,EACH,IAEA,UAEJ;AAEJ;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simpleapps-com/augur-web",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.8",
|
|
4
4
|
"description": "Shared React UI components for Augur ecommerce sites (Radix + Tailwind)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -179,6 +179,11 @@
|
|
|
179
179
|
"types": "./dist/session-replay.d.ts",
|
|
180
180
|
"import": "./dist/session-replay.js",
|
|
181
181
|
"require": "./dist/session-replay.cjs"
|
|
182
|
+
},
|
|
183
|
+
"./provider": {
|
|
184
|
+
"types": "./dist/provider.d.ts",
|
|
185
|
+
"import": "./dist/provider.js",
|
|
186
|
+
"require": "./dist/provider.cjs"
|
|
182
187
|
}
|
|
183
188
|
},
|
|
184
189
|
"sideEffects": false,
|
|
@@ -186,7 +191,7 @@
|
|
|
186
191
|
"dist"
|
|
187
192
|
],
|
|
188
193
|
"dependencies": {
|
|
189
|
-
"@simpleapps-com/augur-utils": "1.0.
|
|
194
|
+
"@simpleapps-com/augur-utils": "1.0.8"
|
|
190
195
|
},
|
|
191
196
|
"peerDependencies": {
|
|
192
197
|
"@radix-ui/react-accordion": "^1.2.0",
|
|
@@ -206,9 +211,12 @@
|
|
|
206
211
|
"react": "^19.0.0",
|
|
207
212
|
"react-dom": "^19.0.0",
|
|
208
213
|
"react-icons": "^5.4.0",
|
|
209
|
-
"tailwindcss": "^3.4.0"
|
|
214
|
+
"tailwindcss": "^3.4.0",
|
|
215
|
+
"@simpleapps-com/augur-core": "1.0.8",
|
|
216
|
+
"@simpleapps-com/augur-hooks": "1.0.8"
|
|
210
217
|
},
|
|
211
218
|
"devDependencies": {
|
|
219
|
+
"@tanstack/react-query": "^5.0.0",
|
|
212
220
|
"@radix-ui/react-accordion": "^1.2.0",
|
|
213
221
|
"@radix-ui/react-checkbox": "^1.1.0",
|
|
214
222
|
"@radix-ui/react-dialog": "^1.1.0",
|
|
@@ -234,7 +242,9 @@
|
|
|
234
242
|
"react-icons": "^5.4.0",
|
|
235
243
|
"tsup": "^8.5.0",
|
|
236
244
|
"vitest": "^3.2.0",
|
|
237
|
-
"@augur-packages/tsconfig": "0.0.0"
|
|
245
|
+
"@augur-packages/tsconfig": "0.0.0",
|
|
246
|
+
"@simpleapps-com/augur-core": "1.0.8",
|
|
247
|
+
"@simpleapps-com/augur-hooks": "1.0.8"
|
|
238
248
|
},
|
|
239
249
|
"scripts": {
|
|
240
250
|
"build": "tsup",
|