Skip to content

Commit f33b050

Browse files
authored
Merge pull request #152 from WatWowMap/google-analytics
Google Analytics
2 parents 2d3675a + 5910220 commit f33b050

30 files changed

+159
-23
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,12 @@ ReactMap supports multiple domain config options. Under the "multiDomain" object
212212
}
213213
```
214214

215+
## Using the .env File
216+
- From the root of the directory `cp example.env .env`
217+
- `nano .env`
218+
- If you want to use Google Analytics, you can add your ID here. Only use debug mode during development.
219+
- You can also set a title for the map if you want it to load it up a bit faster compared to the default Map title.
220+
215221
## Credits
216222

217223
- [MapJS](https://github.com/WatWowMap/MapJS)

example.env

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
GOOGLE_ANALYTICS_ID=
2+
ANALYTICS_DEBUG_MODE=false
3+
TITLE=Map

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"copy-webpack-plugin": "^8.1.0",
3333
"css-loader": "^5.1.4",
3434
"css-minimizer-webpack-plugin": "^2.0.0",
35+
"dotenv": "^10.0.0",
3536
"eslint": "^7.22.0",
3637
"eslint-config-airbnb": "^18.2.1",
3738
"eslint-import-resolver-alias": "^1.1.2",
@@ -88,8 +89,10 @@
8889
"ohbem": "^1.3.0",
8990
"passport": "^0.4.1",
9091
"passport-discord": "https://github.com/tonestrike/passport-discord.git",
92+
"prop-types": "^15.7.2",
9193
"react": "^17.0.2",
9294
"react-dom": "^17.0.2",
95+
"react-ga": "^3.3.0",
9396
"react-i18next": "^11.9.0",
9497
"react-leaflet": "3.1.0",
9598
"react-leaflet-markercluster": "3.0.0-rc1",

server/src/services/ui/clientOptions.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ module.exports = function clientOptions(perms) {
6262
clientValues[key] = {}
6363
Object.entries(options).forEach(option => {
6464
const [name, meta] = option
65-
clientMenus[key][name].value = clientSideOptions[key][name] || meta.value
65+
clientMenus[key][name].value = clientSideOptions[key][name] || meta.value || false
6666
clientMenus[key][name].disabled = !meta.perm.some(x => perms[x])
6767
clientValues[key][name] = meta.value
6868
if (meta.sub) clientMenus[key][name].sub = {}

src/components/App.jsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import UIcons from '@services/Icons'
1414
import Fetch from '@services/Fetch'
1515
import Auth from './Auth'
1616
import Login from './Login'
17+
import RouteChangeTracker from './RouteChangeTracker'
1718

1819
const client = new ApolloClient({
1920
uri: '/graphql',
@@ -63,7 +64,6 @@ export default function App() {
6364
}
6465
setServerSettings({ ...data, Icons })
6566
}
66-
6767
useEffect(() => {
6868
getServerSettings()
6969
}, [])
@@ -72,6 +72,7 @@ export default function App() {
7272
<Suspense fallback="Loading translations...">
7373
<ApolloProvider client={client}>
7474
<Router>
75+
{(serverSettings && serverSettings.googleAnalytics) && <RouteChangeTracker />}
7576
<Switch>
7677
<Route exact path="/">
7778
{serverSettings && <Auth serverSettings={serverSettings} />}

src/components/ConfigSettings.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ import extend from 'extend'
55
import { ThemeProvider } from '@material-ui/styles'
66
import { useMediaQuery } from '@material-ui/core'
77

8+
import Utility from '@services/Utility'
89
import { useStore, useStatic } from '@hooks/useStore'
910
import setTheme from '@assets/mui/theme'
1011
import Map from './Map'
1112

1213
export default function ConfigSettings({
1314
serverSettings, match, paramLocation, paramZoom,
1415
}) {
16+
Utility.analytics('Discord', serverSettings.user ? `${serverSettings.user.username} (${serverSettings.user.id})` : 'Not Logged In', 'Permissions', true)
1517
if (serverSettings.error) {
1618
return (
1719
<Redirect

src/components/Map.jsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React, { useState, useCallback } from 'react'
22
import { TileLayer, useMap } from 'react-leaflet'
33

4+
import Utility from '@services/Utility'
45
import { useStatic, useStore } from '@hooks/useStore'
56
import Nav from './layout/Nav'
67
import QueryData from './QueryData'
@@ -17,6 +18,8 @@ const userSettingsCategory = category => {
1718
}
1819

1920
export default function Map({ serverSettings: { config: { map: config, tileServers }, Icons }, params }) {
21+
Utility.analytics(window.location.pathname)
22+
2023
const map = useMap()
2124
const filters = useStore(state => state.filters)
2225
const settings = useStore(state => state.settings)

src/components/QueryData.jsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import React, { useCallback, useEffect, useState } from 'react'
22
import { useQuery } from '@apollo/client'
3+
4+
import Utility from '@services/Utility'
35
import Query from '@services/Query'
46
import RobustTimeout from '@classes/RobustTimeout'
57
import Clustering from './Clustering'
@@ -24,6 +26,7 @@ export default function QueryData({
2426
category, available, filters, staticFilters, staticUserSettings,
2527
userSettings, perms, Icons, userIcons,
2628
}) {
29+
Utility.analytics('Data', `${category} being fetched`, category, true)
2730
const [timeout] = useState(() => new RobustTimeout(getPolling(category)))
2831

2932
const trimFilters = useCallback(requestedFilters => {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import React from 'react'
2+
import { withRouter } from 'react-router-dom'
3+
import ReactGA from 'react-ga'
4+
5+
const RouteChangeTracker = ({ history }) => {
6+
history.listen((location) => {
7+
ReactGA.set({ page: location.pathname })
8+
ReactGA.pageview(location.pathname)
9+
})
10+
11+
return <div />
12+
}
13+
14+
export default withRouter(RouteChangeTracker)

src/components/layout/Nav.jsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React, { useState } from 'react'
22
import { Dialog, useMediaQuery } from '@material-ui/core'
33
import { useTheme } from '@material-ui/styles'
44

5+
import Utility from '@services/Utility'
56
import useStyles from '@hooks/useStyles'
67
import { useStore, useStatic } from '@hooks/useStore'
78
import FloatingBtn from './FloatingBtn'
@@ -42,6 +43,7 @@ export default function Nav({ map, setManualParams, Icons }) {
4243
}
4344

4445
const toggleDialog = (open, category, type, filter) => (event) => {
46+
Utility.analytics('Menu Toggle', `Open: ${open}`, `Category: ${category} Menu: ${type}`)
4547
if (event.type === 'keydown' && (event.key === 'Tab' || event.key === 'Shift')) {
4648
return
4749
}

0 commit comments

Comments
 (0)