diff --git a/app/components/ScrollToTop/ScrollToTop.js b/app/components/ScrollToTop.js
similarity index 100%
rename from app/components/ScrollToTop/ScrollToTop.js
rename to app/components/ScrollToTop.js
diff --git a/app/components/ScrollToTop/index.js b/app/components/ScrollToTop/index.js
deleted file mode 100644
index 0f8823a18..000000000
--- a/app/components/ScrollToTop/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-// @flow
-import ScrollToTop from './ScrollToTop';
-export default ScrollToTop;
diff --git a/app/index.js b/app/index.js
index d9e6b54f4..b772f37d8 100644
--- a/app/index.js
+++ b/app/index.js
@@ -1,5 +1,5 @@
// @flow
-import React from 'react';
+import * as React from 'react';
import { render } from 'react-dom';
import { Provider } from 'mobx-react';
import {
@@ -49,7 +49,7 @@ const RedirectDocument = ({ match }: { match: Object }) => (
globalStyles();
render(
-
+
@@ -120,6 +120,20 @@ render(
{DevTools && }
- ,
+ ,
document.getElementById('root')
);
+
+window.addEventListener('load', async () => {
+ // installation does not use Google Analytics, or tracking is blocked on client
+ // no point loading the rest of the analytics bundles
+ if (!process.env.GOOGLE_ANALYTICS_ID || !window.ga) return;
+
+ await import('autotrack/lib/plugins/outbound-link-tracker');
+ await import('autotrack/lib/plugins/url-change-tracker');
+
+ window.ga('create', process.env.GOOGLE_ANALYTICS_ID, 'auto');
+ window.ga('require', 'outboundLinkTracker');
+ window.ga('require', 'urlChangeTracker');
+ window.ga('send', 'pageview');
+});
diff --git a/app/scenes/Document/Document.js b/app/scenes/Document/Document.js
index 155eb34fd..8539561a1 100644
--- a/app/scenes/Document/Document.js
+++ b/app/scenes/Document/Document.js
@@ -113,6 +113,7 @@ class DocumentScene extends Component {
if (document) {
this.props.ui.setActiveDocument(document);
+
// Cache data if user enters edit mode and cancels
this.editCache = document.text;
if (!this.isEditing) document.view();
diff --git a/package.json b/package.json
index e3085c97c..d2345b0f1 100644
--- a/package.json
+++ b/package.json
@@ -64,6 +64,7 @@
"@tommoor/slate-drop-or-paste-images": "^0.8.1",
"@tommoor/slate-edit-code": "^0.13.3",
"aws-sdk": "^2.135.0",
+ "autotrack": "^2.4.1",
"babel-core": "^6.24.1",
"babel-eslint": "^8.1.2",
"babel-loader": "^7.1.2",
@@ -145,7 +146,7 @@
"query-string": "^4.3.4",
"randomstring": "1.1.5",
"raw-loader": "^0.5.1",
- "react": "^16.1.0",
+ "react": "^16.2.0",
"react-avatar-editor": "^10.3.0",
"react-dom": "^16.1.0",
"react-dropzone": "4.2.1",
diff --git a/shared/components/Analytics.js b/shared/components/Analytics.js
index 0e37197ce..6524c3392 100644
--- a/shared/components/Analytics.js
+++ b/shared/components/Analytics.js
@@ -1,24 +1,20 @@
// @flow
-import React from 'react';
+import * as React from 'react';
function Analytics() {
- const id = process.env.GOOGLE_ANALYTICS_ID;
- if (!id) return null;
+ if (!process.env.GOOGLE_ANALYTICS_ID) return null;
return (
-
-
+
-
+
+
);
}
diff --git a/webpack.config.js b/webpack.config.js
index f557689b2..4710a40e6 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -16,7 +16,7 @@ const definePlugin = new webpack.DefinePlugin({
DEPLOYMENT: JSON.stringify(process.env.DEPLOYMENT || 'hosted'),
'process.env': {
URL: JSON.stringify(process.env.URL),
- SLACK_KEY: JSON.stringify(process.env.SLACK_KEY),
+ SLACK_KEY: JSON.stringify(process.env.SLACK_KEY)
}
});
diff --git a/yarn.lock b/yarn.lock
index b5566c14f..814124090 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -434,6 +434,21 @@ autoprefixer@^6.3.1:
postcss "^5.2.16"
postcss-value-parser "^3.2.3"
+autotrack@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/autotrack/-/autotrack-2.4.1.tgz#ccbf010e3d95ef23c8dd6db4e8df025135c82ee6"
+ dependencies:
+ chalk "^1.1.3"
+ dom-utils "^0.9.0"
+ fs-extra "^3.0.1"
+ glob "^7.1.1"
+ google-closure-compiler-js "^20170423.0.0"
+ gzip-size "^3.0.0"
+ rollup "^0.41.4"
+ rollup-plugin-memory "^2.0.0"
+ rollup-plugin-node-resolve "^3.0.0"
+ source-map "^0.5.6"
+
aws-sdk@^2.135.0:
version "2.135.0"
resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.135.0.tgz#81f4a47b99212f2f236bf5b11b0b3a3a02086db4"
@@ -1432,7 +1447,7 @@ bugsnag@^1.7.0:
request "^2.81.0"
stack-trace "~0.0.9"
-builtin-modules@^1.0.0, builtin-modules@^1.1.1:
+builtin-modules@^1.0.0, builtin-modules@^1.1.0, builtin-modules@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f"
@@ -1775,10 +1790,18 @@ cliui@^3.2.0:
strip-ansi "^3.0.1"
wrap-ansi "^2.0.0"
+clone-buffer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
+
clone-stats@^0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1"
+clone-stats@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680"
+
clone@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f"
@@ -1787,6 +1810,18 @@ clone@^1.0.0, clone@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149"
+clone@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb"
+
+cloneable-readable@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117"
+ dependencies:
+ inherits "^2.0.1"
+ process-nextick-args "^1.0.6"
+ through2 "^2.0.1"
+
cls-bluebird@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/cls-bluebird/-/cls-bluebird-2.0.1.tgz#c259a480ae02c0e506134307bb13db30446ee2e7"
@@ -2588,6 +2623,10 @@ dom-serializer@0, dom-serializer@~0.1.0:
domelementtype "~1.1.1"
entities "~1.1.1"
+dom-utils@^0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/dom-utils/-/dom-utils-0.9.0.tgz#e615a5af15ac4505e55ef612c72b5b5d176121f3"
+
dom-walk@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
@@ -2665,7 +2704,7 @@ duplexer3@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
-duplexer@~0.1.1:
+duplexer@^0.1.1, duplexer@~0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1"
@@ -3631,6 +3670,14 @@ fs-extra@^0.30.0:
path-is-absolute "^1.0.0"
rimraf "^2.2.8"
+fs-extra@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291"
+ dependencies:
+ graceful-fs "^4.1.2"
+ jsonfile "^3.0.0"
+ universalify "^0.1.0"
+
fs-extra@^4.0.0, fs-extra@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.1.tgz#7fc0c6c8957f983f57f306a24e5b9ddd8d0dd880"
@@ -3901,6 +3948,14 @@ good-listener@^1.2.2:
dependencies:
delegate "^3.1.2"
+google-closure-compiler-js@^20170423.0.0:
+ version "20170423.0.0"
+ resolved "https://registry.yarnpkg.com/google-closure-compiler-js/-/google-closure-compiler-js-20170423.0.0.tgz#e9e8b40dadfdf0e64044c9479b5d26d228778fbc"
+ dependencies:
+ minimist "^1.2.0"
+ vinyl "^2.0.1"
+ webpack-core "^0.6.8"
+
got@^3.2.0:
version "3.3.1"
resolved "https://registry.yarnpkg.com/got/-/got-3.3.1.tgz#e5d0ed4af55fc3eef4d56007769d98192bcb2eca"
@@ -4011,6 +4066,12 @@ gulplog@^1.0.0:
dependencies:
glogg "^1.0.0"
+gzip-size@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-3.0.0.tgz#546188e9bdc337f673772f81660464b389dce520"
+ dependencies:
+ duplexer "^0.1.1"
+
handlebars@^4.0.3:
version "4.0.10"
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f"
@@ -4717,6 +4778,10 @@ is-lower-case@^1.1.0:
dependencies:
lower-case "^1.1.0"
+is-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591"
+
is-nan@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.2.1.tgz#9faf65b6fb6db24b7f5c0628475ea71f988401e2"
@@ -7641,7 +7706,7 @@ private@^0.1.6, private@^0.1.7, private@~0.1.5:
version "0.1.7"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1"
-process-nextick-args@~1.0.6:
+process-nextick-args@^1.0.6, process-nextick-args@~1.0.6:
version "1.0.7"
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3"
@@ -7996,9 +8061,9 @@ react@^15.5.4:
object-assign "^4.1.0"
prop-types "^15.5.10"
-react@^16.1.0:
- version "16.1.0"
- resolved "https://registry.npmjs.org/react/-/react-16.1.0.tgz#1c2bdac3c17fe7ee9282fa35aca6cc36387903e1"
+react@^16.2.0:
+ version "16.2.0"
+ resolved "https://registry.yarnpkg.com/react/-/react-16.2.0.tgz#a31bd2dab89bff65d42134fa187f24d054c273ba"
dependencies:
fbjs "^0.8.16"
loose-envify "^1.1.0"
@@ -8286,9 +8351,9 @@ replace-ext@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924"
-replace-ext@1.0.0:
+replace-ext@1.0.0, replace-ext@^1.0.0:
version "1.0.0"
- resolved "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
+ resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb"
request-promise-core@1.1.1:
version "1.1.1"
@@ -8460,6 +8525,24 @@ rndm@1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/rndm/-/rndm-1.2.0.tgz#f33fe9cfb52bbfd520aa18323bc65db110a1b76c"
+rollup-plugin-memory@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-memory/-/rollup-plugin-memory-2.0.0.tgz#0a8ac6b57fa0e714f89a15c3ac82bc93f89c47c5"
+
+rollup-plugin-node-resolve@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.2.tgz#38babc12fd404cc2ba1ff68648fe43fa3ffee6b0"
+ dependencies:
+ builtin-modules "^1.1.0"
+ is-module "^1.0.0"
+ resolve "^1.1.6"
+
+rollup@^0.41.4:
+ version "0.41.6"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.41.6.tgz#e0d05497877a398c104d816d2733a718a7a94e2a"
+ dependencies:
+ source-map-support "^0.4.0"
+
run-async@^2.2.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0"
@@ -8855,6 +8938,16 @@ source-list-map@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085"
+source-list-map@~0.1.7:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.8.tgz#c550b2ab5427f6b3f21f5afead88c4f5587b2106"
+
+source-map-support@^0.4.0:
+ version "0.4.18"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f"
+ dependencies:
+ source-map "^0.5.6"
+
source-map-support@^0.4.15:
version "0.4.17"
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.17.tgz#6f2150553e6375375d0ccb3180502b78c18ba430"
@@ -8879,7 +8972,7 @@ source-map@0.1.x:
dependencies:
amdefine ">=0.0.4"
-source-map@0.4.x, source-map@^0.4.4:
+source-map@0.4.x, source-map@^0.4.4, source-map@~0.4.1:
version "0.4.4"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b"
dependencies:
@@ -9304,7 +9397,7 @@ through2@^0.6.1, through2@^0.6.2, through2@^0.6.5:
readable-stream ">=1.0.33-1 <1.1.0-0"
xtend ">=4.0.0 <4.1.0-0"
-through2@^2.0.0:
+through2@^2.0.0, through2@^2.0.1:
version "2.0.3"
resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be"
dependencies:
@@ -9863,6 +9956,17 @@ vinyl@^0.5.0:
clone-stats "^0.0.1"
replace-ext "0.0.1"
+vinyl@^2.0.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.1.0.tgz#021f9c2cf951d6b939943c89eb5ee5add4fd924c"
+ dependencies:
+ clone "^2.1.1"
+ clone-buffer "^1.0.0"
+ clone-stats "^1.0.0"
+ cloneable-readable "^1.0.0"
+ remove-trailing-separator "^1.0.1"
+ replace-ext "^1.0.0"
+
vm-browserify@0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73"
@@ -9913,6 +10017,13 @@ webidl-conversions@^4.0.1, webidl-conversions@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
+webpack-core@^0.6.8:
+ version "0.6.9"
+ resolved "https://registry.yarnpkg.com/webpack-core/-/webpack-core-0.6.9.tgz#fc571588c8558da77be9efb6debdc5a3b172bdc2"
+ dependencies:
+ source-list-map "~0.1.7"
+ source-map "~0.4.1"
+
webpack-dev-middleware@^1.10.0:
version "1.12.0"
resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz#d34efefb2edda7e1d3b5dbe07289513219651709"