From 4f28dabc0b27105c13fb904d2624367d87f36331 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Sun, 6 Jul 2025 08:56:20 +0200 Subject: [PATCH] GA support --- frontend/index.html | 11 ----------- frontend/package-lock.json | 40 ++++++++++++++++++++++++++++++++++++++ frontend/package.json | 1 + frontend/src/App.jsx | 6 ++++++ 4 files changed, 47 insertions(+), 11 deletions(-) diff --git a/frontend/index.html b/frontend/index.html index 16ff4cf9..f0255334 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -32,17 +32,6 @@ s.crossOrigin = 'anonymous'; document.head.appendChild(s); } - if (window.env && window.env.VITE_GA_ID) { - const g = document.createElement('script'); - g.async = true; - g.src = - 'https://www.googletagmanager.com/gtag/js?id=' + window.env.VITE_GA_ID; - document.head.appendChild(g); - window.dataLayer = window.dataLayer || []; - function gtag(){dataLayer.push(arguments);} - gtag('js', new Date()); - gtag('config', window.env.VITE_GA_ID); - } diff --git a/frontend/package-lock.json b/frontend/package-lock.json index b05f7cec..695837c6 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -12,6 +12,7 @@ "firebase": "^9.23.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-ga": "^3.3.1", "xml-formatter": "^3.6.6" }, "devDependencies": { @@ -2280,6 +2281,16 @@ "dev": true, "license": "MIT" }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -2316,6 +2327,18 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/protobufjs": { "version": "6.11.4", "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", @@ -2367,6 +2390,23 @@ "react": "^18.3.1" } }, + "node_modules/react-ga": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/react-ga/-/react-ga-3.3.1.tgz", + "integrity": "sha512-4Vc0W5EvXAXUN/wWyxvsAKDLLgtJ3oLmhYYssx+YzphJpejtOst6cbIHCIyF50Fdxuf5DDKqRYny24yJ2y7GFQ==", + "license": "Apache-2.0", + "peerDependencies": { + "prop-types": "^15.6.0", + "react": "^15.6.2 || ^16.0 || ^17 || ^18" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT", + "peer": true + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index 553f2741..49bd917e 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,6 +12,7 @@ "firebase": "^9.23.0", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-ga": "^3.3.1", "xml-formatter": "^3.6.6" }, "devDependencies": { diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index a0f46e34..f92186a7 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,4 +1,5 @@ import { useState, useEffect, useCallback, useRef } from "react"; +import ReactGA from 'react-ga'; import Editor from "@monaco-editor/react"; import formatXML from "xml-formatter"; import { initializeApp } from "firebase/app"; @@ -137,10 +138,15 @@ export default function App() { const backendBase = (env.VITE_BACKEND_URL || "").replace(/\/$/, ""); console.log("Using this URL as backendURL:", backendBase); + useEffect(() => { + ReactGA.initialize(env.VITE_GA_ID); + }, []); + useEffect(() => { if (goPro) { sessionStorage.setItem("tabs", JSON.stringify(tabs)); } + }, [tabs]); useEffect(() => {