diff --git a/packages/strapi-admin/admin/src/containers/AdminPage/actions.js b/packages/strapi-admin/admin/src/containers/AdminPage/actions.js index 0219473c7f..1e6c500ca4 100644 --- a/packages/strapi-admin/admin/src/containers/AdminPage/actions.js +++ b/packages/strapi-admin/admin/src/containers/AdminPage/actions.js @@ -3,3 +3,17 @@ * AdminPage actions * */ +import { GET_GA_STATUS, GET_GA_STATUS_SUCCEEDED } from './constants'; + +export function getGaStatus() { + return { + type: GET_GA_STATUS, + }; +} + +export function getGaStatusSucceeded(allowGa) { + return { + type: GET_GA_STATUS_SUCCEEDED, + allowGa, + }; +} diff --git a/packages/strapi-admin/admin/src/containers/AdminPage/constants.js b/packages/strapi-admin/admin/src/containers/AdminPage/constants.js index 3c3f4590f6..f221882b56 100644 --- a/packages/strapi-admin/admin/src/containers/AdminPage/constants.js +++ b/packages/strapi-admin/admin/src/containers/AdminPage/constants.js @@ -3,3 +3,6 @@ * AdminPage constants * */ + +export const GET_GA_STATUS = 'app/Admin/GET_GA_STATUS'; +export const GET_GA_STATUS_SUCCEEDED = 'app/Admin/GET_GA_STATUS_SUCCEEDED'; diff --git a/packages/strapi-admin/admin/src/containers/AdminPage/index.js b/packages/strapi-admin/admin/src/containers/AdminPage/index.js index 184d4042d2..56972389f1 100644 --- a/packages/strapi-admin/admin/src/containers/AdminPage/index.js +++ b/packages/strapi-admin/admin/src/containers/AdminPage/index.js @@ -52,6 +52,7 @@ import auth from 'utils/auth'; import injectReducer from 'utils/injectReducer'; import injectSaga from 'utils/injectSaga'; +import { getGaStatus } from './actions'; import reducer from './reducer'; import saga from './saga'; import selectAdminPage from './selectors'; @@ -72,7 +73,7 @@ export class AdminPage extends React.Component { // eslint-disable-line react/pr componentDidMount() { this.checkLogin(this.props); - + this.props.getGaStatus(); ReactGA.initialize('UA-54313258-9'); } @@ -80,7 +81,9 @@ export class AdminPage extends React.Component { // eslint-disable-line react/pr if (nextProps.location.pathname !== this.props.location.pathname) { this.checkLogin(nextProps); - ReactGA.pageview(nextProps.location.pathname); + if (nextProps.adminPage.allowGa) { + ReactGA.pageview(nextProps.location.pathname); + } } if (get(nextProps.plugins.toJS(), ['users-permissions', 'hasAdminUser']) !== get(this.props.plugins.toJS(), ['users-permissions', 'hasAdminUser'])) { @@ -185,6 +188,7 @@ AdminPage.propTypes = { blockApp: PropTypes.bool.isRequired, disableGlobalOverlayBlocker: PropTypes.func.isRequired, enableGlobalOverlayBlocker: PropTypes.func.isRequired, + getGaStatus: PropTypes.func.isRequired, hasUserPlugin: PropTypes.bool, history: PropTypes.object.isRequired, location: PropTypes.object.isRequired, @@ -206,6 +210,7 @@ function mapDispatchToProps(dispatch) { return { disableGlobalOverlayBlocker: () => { dispatch(disableGlobalOverlayBlocker()); }, enableGlobalOverlayBlocker: () => { dispatch(enableGlobalOverlayBlocker()); }, + getGaStatus: () => { dispatch(getGaStatus()); }, onHideNotification: (id) => { dispatch(hideNotification(id)); }, pluginLoaded: (plugin) => { dispatch(pluginLoaded(plugin)); }, updatePlugin: (pluginId, updatedKey, updatedValue) => { dispatch(updatePlugin(pluginId, updatedKey, updatedValue)); }, diff --git a/packages/strapi-admin/admin/src/containers/AdminPage/reducer.js b/packages/strapi-admin/admin/src/containers/AdminPage/reducer.js index f9689cf239..1ed43f83a3 100644 --- a/packages/strapi-admin/admin/src/containers/AdminPage/reducer.js +++ b/packages/strapi-admin/admin/src/containers/AdminPage/reducer.js @@ -6,10 +6,16 @@ import { fromJS } from 'immutable'; -const initialState = fromJS({}); +import { GET_GA_STATUS_SUCCEEDED } from './constants'; + +const initialState = fromJS({ + allowGa: true, +}); function adminPageReducer(state = initialState, action) { switch (action.type) { + case GET_GA_STATUS_SUCCEEDED: + return state.update('allowGa', () => action.allowGa); default: return state; } diff --git a/packages/strapi-admin/admin/src/containers/AdminPage/saga.js b/packages/strapi-admin/admin/src/containers/AdminPage/saga.js index db4ce55402..652620b52e 100644 --- a/packages/strapi-admin/admin/src/containers/AdminPage/saga.js +++ b/packages/strapi-admin/admin/src/containers/AdminPage/saga.js @@ -1,3 +1,20 @@ -function* defaultSaga() {} +import { fork, call, put, takeLatest } from 'redux-saga/effects'; +import request from 'utils/request'; + +import { getGaStatusSucceeded } from './actions'; +import { GET_GA_STATUS } from './constants'; + +function* getGaStatus() { + try { + const response = yield call(request, '/admin/gaConfig', { method: 'GET' }); + yield put(getGaStatusSucceeded(response.allowGa)); + } catch(err) { + strapi.notification.error('notification.error'); + } +} + +function* defaultSaga() { + yield fork(takeLatest, GET_GA_STATUS, getGaStatus); +} export default defaultSaga; diff --git a/packages/strapi-admin/config/routes.json b/packages/strapi-admin/config/routes.json index 4182bd9a0c..30bf450a38 100755 --- a/packages/strapi-admin/config/routes.json +++ b/packages/strapi-admin/config/routes.json @@ -14,6 +14,12 @@ "handler": "Admin.getCurrentEnvironment", "policies": [] }, + { + "method": "GET", + "path": "/gaConfig", + "handler": "Admin.getGaConfig", + "policies": [] + }, { "method": "POST", "path": "/plugins/install", diff --git a/packages/strapi-admin/controllers/Admin.js b/packages/strapi-admin/controllers/Admin.js index d90b51241b..78588cf9b9 100755 --- a/packages/strapi-admin/controllers/Admin.js +++ b/packages/strapi-admin/controllers/Admin.js @@ -2,6 +2,7 @@ const path = require('path'); const exec = require('child_process').execSync; +const _ = require('lodash'); /** * A set of functions called "actions" for `Admin` @@ -16,6 +17,16 @@ module.exports = { } }, + getGaConfig: async ctx =>{ + try { + const allowGa = _.get(strapi.config, 'info.customs.allowGa', true); + ctx.send({ allowGa }); + } catch(err) { + console.log(err) + ctx.badRequest(null, [{ messages: [{ id: 'An error occured' }] }]); + } + }, + installPlugin: async ctx => { try { const { plugin, port } = ctx.request.body; diff --git a/packages/strapi-admin/doc/disable-tracking.md b/packages/strapi-admin/doc/disable-tracking.md new file mode 100644 index 0000000000..e16bc9f537 --- /dev/null +++ b/packages/strapi-admin/doc/disable-tracking.md @@ -0,0 +1,16 @@ +# DISCLAIMER: + +Google Analytics allows us to analyze the usage of Strapi. The aim is to +improve the product and helps us to understand how you interact with the Admin. + +Note: The collected data are anonymous and aren't sold to anyone! + +If you don't want to share your data with us, you can simply modify the `strapi` object in the package.json as follows: + +```json +{ + "strapi": { + "allowGa": false + } +} +``` diff --git a/packages/strapi-admin/package.json b/packages/strapi-admin/package.json index b92fee5414..b8e33a2337 100755 --- a/packages/strapi-admin/package.json +++ b/packages/strapi-admin/package.json @@ -48,4 +48,4 @@ "npm": ">= 3.0.0" }, "license": "MIT" -} +} \ No newline at end of file diff --git a/packages/strapi/lib/core/configurations.js b/packages/strapi/lib/core/configurations.js index 4d6005b159..476bff5898 100755 --- a/packages/strapi/lib/core/configurations.js +++ b/packages/strapi/lib/core/configurations.js @@ -73,6 +73,7 @@ module.exports.nested = function() { module.exports.app = async function() { // Retrieve Strapi version. this.config.uuid = get(this.config.info, 'strapi.uuid', ''); + this.config.info.customs = get(this.config.info, 'strapi', {}); this.config.info.strapi = (get(this.config, 'info.dependencies.strapi') || '').replace(/(\^|~)/g, ''), this.config.info.node = process.versions.node;