1 | import IS_BROWSER from '../helpers/is-browser'
|
2 | import { createSelector, HAS_DEBUG_FLAG } from 'redux-bundler'
|
3 |
|
4 | const valid = ['eventCategory', 'eventAction', 'eventLabel', 'eventValue']
|
5 | const isValidateEvent = obj => Object.keys(obj).every(valid.includes)
|
6 |
|
7 | export default (gaId, prefix = '') => {
|
8 |
|
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 | }
|