diff --git a/.circleci/config.yml b/.circleci/config.yml index 0e161844..a5584398 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -16,7 +16,7 @@ jobs: paths: - node_modules - run: npm test - - run: npm run build + - run: npm run build --tag=test=release - persist_to_workspace: root: . paths: @@ -28,6 +28,7 @@ jobs: - attach_workspace: at: . - run: echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc + - run: npm install - run: npm publish # dont change anything workflows: diff --git a/__tests__/__snapshots__/index.js.snap b/__tests__/__snapshots__/index.js.snap index 18663275..416655e0 100644 --- a/__tests__/__snapshots__/index.js.snap +++ b/__tests__/__snapshots__/index.js.snap @@ -387,5 +387,11 @@ Object { "delay": [Function], "formatDuration": [Function], }, + "tracking": Object { + "default": undefined, + "event": [Function], + "init": [Function], + "pageView": [Function], + }, } `; diff --git a/config/default.json b/config/default.json index 38d4e982..e7c3a7bf 100644 --- a/config/default.json +++ b/config/default.json @@ -2,5 +2,6 @@ "AV_SCAN_SCORER_REVIEW_TYPE_ID": "", "PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID": "", "PAGE_SIZE": 50, - "REVIEW_OPPORTUNITY_PAGE_SIZE": 1000 + "REVIEW_OPPORTUNITY_PAGE_SIZE": 1000, + "GOOGLE_ANALYTICS_ID": "" } diff --git a/config/development.json b/config/development.json index b1519a01..95eeb428 100644 --- a/config/development.json +++ b/config/development.json @@ -1,4 +1,5 @@ { "AV_SCAN_SCORER_REVIEW_TYPE_ID": "68c5a381-c8ab-48af-92a7-7a869a4ee6c3", - "PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID": "52c91e85-745f-4e62-b592-9879a2dfe9fd" + "PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID": "52c91e85-745f-4e62-b592-9879a2dfe9fd", + "GOOGLE_ANALYTICS_ID": "UA-161803421-1" } diff --git a/config/production.json b/config/production.json index d2b1223d..92031113 100644 --- a/config/production.json +++ b/config/production.json @@ -1,4 +1,5 @@ { "AV_SCAN_SCORER_REVIEW_TYPE_ID": "55bbb17d-aac2-45a6-89c3-a8d102863d05", - "PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID": "df51ca7d-fb0a-4147-9569-992fcf5aae48" + "PROVISIONAL_SCORING_COMPLETED_REVIEW_TYPE_ID": "df51ca7d-fb0a-4147-9569-992fcf5aae48", + "GOOGLE_ANALYTICS_ID": "UA-6340959-1" } diff --git a/config/webpack/default.js b/config/webpack/default.js index 4872dd72..3ef26273 100644 --- a/config/webpack/default.js +++ b/config/webpack/default.js @@ -19,6 +19,7 @@ module.exports = { 'moment-duration-format', 'react', 'react-dom', + 'react-ga', 'redux', 'redux-actions', 'isomorphic-fetch', diff --git a/package.json b/package.json index b5a3500b..1f514eee 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "url": "git+https://github.com/topcoder-platform/topcoder-react-lib.git" }, "scripts": { + "prepare": "npm run build", "build": "npm run clean && npm run build:dev && npm run build:prod", "build:dev": "./node_modules/.bin/webpack --env=development --progress --profile --colors --display-optimization-bailout", "build:dev:watch": "npm run clean && ./node_modules/.bin/webpack --env=development --progress --profile --colors --watch --display-optimization-bailout", @@ -31,7 +32,7 @@ "lint:js": "./node_modules/.bin/eslint --ext .js,.jsx .", "test": "npm run lint && npm run jest" }, - "version": "0.15.0", + "version": "1000.13.3", "dependencies": { "auth0-js": "^6.8.4", "config": "^3.2.0", @@ -44,6 +45,7 @@ "qs": "^6.5.2", "react": "^16.4.1", "react-dom": "^16.4.1", + "react-ga": "^2.7.0", "react-redux": "^6.0.1", "redux": "^3.7.2", "redux-actions": "^2.4.0", diff --git a/src/index.js b/src/index.js index 78103660..b8c4c79f 100644 --- a/src/index.js +++ b/src/index.js @@ -12,5 +12,5 @@ export { actions } from './actions'; export { services } from './services'; export { - challenge, logger, errors, tc, time, mock, submission, + challenge, logger, errors, tc, time, mock, submission, tracking, } from './utils'; diff --git a/src/utils/index.js b/src/utils/index.js index 6a6387a4..d0212e21 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -8,6 +8,7 @@ import * as mock from './mock'; import * as errors from './errors'; import * as filter from './challenge/filter'; import * as submission from './submission'; +import * as tracking from './tracking'; const challenge = { filter, @@ -21,4 +22,5 @@ export { mock, errors, submission, + tracking, }; diff --git a/src/utils/tracking.js b/src/utils/tracking.js new file mode 100644 index 00000000..4b764615 --- /dev/null +++ b/src/utils/tracking.js @@ -0,0 +1,47 @@ +/* global window */ +/* global CONFIG */ + +import ReactGA from 'react-ga'; + +const { GOOGLE_ANALYTICS_ID } = CONFIG; +const TRACKING_NAME = 'tracking'; + +/** + * init - Init Google Analytics tracking + * @param {string} userId + */ +export const init = (userId) => { + ReactGA.initialize([{ + trackingId: GOOGLE_ANALYTICS_ID, + gaOptions: { + name: TRACKING_NAME, + userId, + }, + }], { + alwaysSendToDefaultTracker: false, + }); +}; + +/** + * pageView - Track page view + */ +export const pageView = () => { + ReactGA.pageview(window.location.pathname + + window.location.search, [TRACKING_NAME]); +}; + +/** + * event - Add custom tracking event. + * @param {string} category + * @param {string} action + * @param {string} label + */ +export const event = (category, action, label) => { + ReactGA.event({ + category, + action, + label, + }, [TRACKING_NAME]); +}; + +export default undefined;