Spaces:
Build error
Build error
📈 Add GTM (#119)
Browse files* add GTM
following Hub setup
* update comment link for GA v4
Co-authored-by: Pierric Cistac <[email protected]>
---------
Co-authored-by: Pierric Cistac <[email protected]>
- src/app.html +20 -0
- src/lib/utils/analytics.ts +39 -0
src/app.html
CHANGED
|
@@ -17,5 +17,25 @@
|
|
| 17 |
</head>
|
| 18 |
<body data-sveltekit-preload-data="hover" class="h-full dark:bg-gray-900">
|
| 19 |
<div class="contents h-full">%sveltekit.body%</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
</body>
|
| 21 |
</html>
|
|
|
|
| 17 |
</head>
|
| 18 |
<body data-sveltekit-preload-data="hover" class="h-full dark:bg-gray-900">
|
| 19 |
<div class="contents h-full">%sveltekit.body%</div>
|
| 20 |
+
|
| 21 |
+
<!-- Google Tag Manager -->
|
| 22 |
+
<script>
|
| 23 |
+
if (["hf.co", "huggingface.co"].includes(window.location.hostname)) {
|
| 24 |
+
const script = document.createElement("script");
|
| 25 |
+
script.src = "https://www.googletagmanager.com/gtag/js?id=G-8Q63TH4CSL";
|
| 26 |
+
script.async = true;
|
| 27 |
+
document.head.appendChild(script);
|
| 28 |
+
|
| 29 |
+
window.dataLayer = window.dataLayer || [];
|
| 30 |
+
function gtag() {
|
| 31 |
+
dataLayer.push(arguments);
|
| 32 |
+
}
|
| 33 |
+
gtag("js", new Date());
|
| 34 |
+
/// ^ See https://developers.google.com/tag-platform/gtagjs/install
|
| 35 |
+
gtag("consent", "default", { ad_storage: "denied", analytics_storage: "denied" });
|
| 36 |
+
/// ^ See https://developers.google.com/tag-platform/gtagjs/reference#consent
|
| 37 |
+
/// TODO: ask the user for their consent and update this with gtag('consent', 'update')
|
| 38 |
+
}
|
| 39 |
+
</script>
|
| 40 |
</body>
|
| 41 |
</html>
|
src/lib/utils/analytics.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
export interface GAEvent {
|
| 2 |
+
hitType: "event";
|
| 3 |
+
eventCategory: string;
|
| 4 |
+
eventAction: string;
|
| 5 |
+
eventLabel?: string;
|
| 6 |
+
eventValue?: number;
|
| 7 |
+
}
|
| 8 |
+
|
| 9 |
+
// Send a Google Analytics event
|
| 10 |
+
export function sendAnalyticsEvent({
|
| 11 |
+
eventCategory,
|
| 12 |
+
eventAction,
|
| 13 |
+
eventLabel,
|
| 14 |
+
eventValue,
|
| 15 |
+
}: Omit<GAEvent, "hitType">): void {
|
| 16 |
+
// Mandatory fields
|
| 17 |
+
const event: GAEvent = {
|
| 18 |
+
hitType: "event",
|
| 19 |
+
eventCategory,
|
| 20 |
+
eventAction,
|
| 21 |
+
};
|
| 22 |
+
// Optional fields
|
| 23 |
+
if (eventLabel) {
|
| 24 |
+
event.eventLabel = eventLabel;
|
| 25 |
+
}
|
| 26 |
+
if (eventValue) {
|
| 27 |
+
event.eventValue = eventValue;
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
// @ts-expect-error typescript doesn't know gtag is on the window object
|
| 31 |
+
if (!!window?.gtag && typeof window?.gtag === "function") {
|
| 32 |
+
// @ts-expect-error typescript doesn't know gtag is on the window object
|
| 33 |
+
window?.gtag("event", eventAction, {
|
| 34 |
+
event_category: event.eventCategory,
|
| 35 |
+
event_label: event.eventLabel,
|
| 36 |
+
value: event.eventValue,
|
| 37 |
+
});
|
| 38 |
+
}
|
| 39 |
+
}
|