UNPKG

1.44 kBJavaScriptView Raw
1import IS_BROWSER from '../helpers/is-browser'
2import { createSelector, HAS_DEBUG_FLAG } from 'redux-bundler'
3
4const valid = ['eventCategory', 'eventAction', 'eventLabel', 'eventValue']
5const isValidateEvent = obj => Object.keys(obj).every(valid.includes)
6
7export default (gaId, prefix = '') => {
8 // set up GA
9 const ga = window.ga = function () {
10 ga.q.push(arguments)
11 }
12 ga.q = []
13 ga.l = Date.now()
14 ga('create', gaId, 'auto')
15
16 return {
17 name: 'googleAnalytics',
18 selectAnalyticsData: createSelector(
19 'selectRouteInfo',
20 ({pattern, url, params}) => ({
21 pageName: `${prefix}${pattern}`,
22 meta: Object.assign({}, params, {url})
23 })
24 ),
25 init: (store) => {
26 let data
27 store.subscribe(() => {
28 const result = store.selectAnalyticsData()
29 if (result !== data) {
30 window.ga('set', 'page', result.pageName, result.meta)
31 window.ga('send', 'pageview')
32 data = result
33 }
34 })
35 },
36 getMiddleware: () => {
37 return ({getState}) => next => action => {
38 if (IS_BROWSER && action.ga) {
39 if (HAS_DEBUG_FLAG) {
40 if (!isValidateEvent(action.ga)) {
41 console.error('GA event data', action.ga)
42 } else {
43 console.log('GA event:', action.ga)
44 }
45 }
46 window.ga('send', 'event', action.ga)
47 }
48 next(action)
49 }
50 }
51 }
52}