Skip to content

Commit 332a4dc

Browse files
committed
UPDATE web analytics
1 parent be31709 commit 332a4dc

5 files changed

Lines changed: 61 additions & 2 deletions

File tree

frontend/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"react": "^18.2.0",
1515
"react-bootstrap": "^2.10.9",
1616
"react-dom": "^18.2.0",
17+
"react-ga4": "^2.1.0",
1718
"react-intersection-observer": "^9.16.0",
1819
"react-router-dom": "^6.14.2",
1920
"react-scripts": "5.0.1",

frontend/src/App.js

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import React from 'react';
2-
import { Routes, Route } from 'react-router-dom';
1+
import React, { useEffect } from 'react';
2+
import { Routes, Route, useLocation } from 'react-router-dom';
33
import Home from './pages/Home';
44
import Plugin from './pages/Plugin';
55
import EnhancedPlugin from './pages/EnhancedPlugin';
@@ -11,8 +11,48 @@ import Navbar from './components/Navbar';
1111
import Footer from './components/Footer';
1212
import FloatingActionButton from './components/FloatingActionButton';
1313
import ErrorBoundary from './components/ErrorBoundary';
14+
import analytics from './services/analytics';
1415

1516
function App() {
17+
const location = useLocation();
18+
19+
// Initialize Google Analytics
20+
useEffect(() => {
21+
analytics.initialize();
22+
}, []);
23+
24+
// Track page views on route changes
25+
useEffect(() => {
26+
const getPageTitle = (pathname) => {
27+
const routes = {
28+
'/': 'Home - Quantum Field Kit',
29+
'/glossary': 'Glossary - Quantum Field Kit',
30+
'/circuit-designer': 'Circuit Designer - Quantum Field Kit'
31+
};
32+
33+
// Handle dynamic routes
34+
if (pathname.startsWith('/plugin/')) {
35+
const pluginKey = pathname.split('/')[2];
36+
return `${pluginKey} Plugin - Quantum Field Kit`;
37+
}
38+
39+
if (pathname.startsWith('/legacy-plugin/')) {
40+
const pluginKey = pathname.split('/')[2];
41+
return `${pluginKey} Legacy Plugin - Quantum Field Kit`;
42+
}
43+
44+
if (pathname.startsWith('/category/')) {
45+
const category = pathname.split('/')[2];
46+
return `${category} Category - Quantum Field Kit`;
47+
}
48+
49+
return routes[pathname] || 'Quantum Field Kit';
50+
};
51+
52+
const title = getPageTitle(location.pathname);
53+
analytics.trackPageView(location.pathname, title);
54+
}, [location]);
55+
1656
return (
1757
<ErrorBoundary>
1858
<div className="App app-shell min-h-screen bg-base-100 text-base-content">

frontend/src/pages/CircuitDesigner.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Card, Button, Form, Nav, Tab, Spinner, Modal, InputGroup, Alert } from
33
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
44
import { faAtom, faPlay, faTrash, faSave, faCode, faChartBar, faPoll, faProjectDiagram, faCopy } from '@fortawesome/free-solid-svg-icons';
55
import { getAvailableGates, runCircuitSimulation, saveCircuit, getSavedCircuits, exportCircuitCode } from '../services/api';
6+
import analytics from '../services/analytics';
67

78
const CircuitDesigner = () => {
89
// State variables
@@ -51,6 +52,9 @@ const CircuitDesigner = () => {
5152
useEffect(() => {
5253
// Initialize the circuit designer
5354
initializeCircuitDesigner();
55+
56+
// Track circuit designer page view
57+
analytics.trackEducationalContent('circuit_designer', 'page_view');
5458
}, []);
5559

5660
const initializeCircuitDesigner = async () => {

frontend/src/pages/EnhancedPlugin.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import Card from '../design-system/components/Card';
1717
import EnhancedPluginParameterForm from '../components/plugin/EnhancedPluginParameterForm';
1818
import EnhancedPluginResultsPanel from '../components/plugin/EnhancedPluginResultsPanel';
1919
import SkeletonLoader from '../components/SkeletonLoader';
20+
import analytics from '../services/analytics';
2021

2122
const EnhancedPlugin = () => {
2223
const { pluginKey } = useParams();
@@ -47,6 +48,9 @@ const EnhancedPlugin = () => {
4748
setPlugin(pluginData);
4849
setEducationalContent(eduData.content || '');
4950

51+
// Track plugin view
52+
analytics.trackPluginInteraction(pluginKey, 'view');
53+
5054
// Set initial parameter values
5155
const initialValues = pluginData.parameters.reduce(
5256
(acc, param) => ({ ...acc, [param.name]: param.default }),
@@ -73,11 +77,20 @@ const EnhancedPlugin = () => {
7377
setError(null);
7478
setResult(null);
7579

80+
// Track simulation run
81+
analytics.trackSimulationRun(pluginKey, params);
82+
7683
const simResult = await runPlugin(pluginKey, params);
7784
setResult(simResult);
7885

86+
// Track successful simulation
87+
analytics.trackPluginInteraction(pluginKey, 'simulation_success', params);
88+
7989
} catch (err) {
8090
setError(err.message);
91+
92+
// Track simulation error
93+
analytics.trackError('simulation_error', err.message, `plugin_${pluginKey}`);
8194
} finally {
8295
setSimulating(false);
8396
}

frontend/src/pages/Glossary.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { fetchGlossary } from '../services/api';
44
import { ChevronDown, Search, BookOpen, Tag, Filter, X } from 'lucide-react';
55
import { Card } from '../design-system';
66
import SkeletonLoader from '../components/SkeletonLoader';
7+
import analytics from '../services/analytics';
78

89
// Component to render mathematical notation properly
910
const MathText = ({ text }) => {

0 commit comments

Comments
 (0)