diff --git a/browser/lib/clientKey.js b/browser/lib/clientKey.js deleted file mode 100644 index 5d5c1f3c..00000000 --- a/browser/lib/clientKey.js +++ /dev/null @@ -1,23 +0,0 @@ -import _ from 'lodash' -import keygen from './keygen' - -function getClientKey () { - let clientKey = localStorage.getItem('clientKey') - if (!_.isString(clientKey) || clientKey.length !== 40) { - clientKey = keygen(20) - setClientKey(clientKey) - } - - return clientKey -} - -function setClientKey (newKey) { - localStorage.setItem('clientKey', newKey) -} - -getClientKey() - -export default { - get: getClientKey, - set: setClientKey -} diff --git a/browser/main/Main.js b/browser/main/Main.js index cbc1e7ec..17128467 100644 --- a/browser/main/Main.js +++ b/browser/main/Main.js @@ -12,6 +12,11 @@ import _ from 'lodash' import ConfigManager from 'browser/main/lib/ConfigManager' import modal from 'browser/main/lib/modal' import InitModal from 'browser/main/modals/InitModal' +import mixpanel from 'browser/main/lib/mixpanel' + +function focused () { + mixpanel.track('MAIN_FOCUSED') +} class Main extends React.Component { constructor (props) { @@ -49,6 +54,12 @@ class Main extends React.Component { modal.open(InitModal) } }) + + window.addEventListener('focus', focused) + } + + componentWillUnmount () { + window.removeEventListener('focus', focused) } handleLeftSlideMouseDown (e) { diff --git a/browser/main/index.js b/browser/main/index.js index 4dfd0078..56dffb11 100644 --- a/browser/main/index.js +++ b/browser/main/index.js @@ -7,6 +7,7 @@ require('!!style!css!stylus?sourceMap!./global.styl') import { Router, Route, IndexRoute, IndexRedirect, hashHistory } from 'react-router' import { syncHistoryWithStore } from 'react-router-redux' require('./lib/ipcClient') + const electron = require('electron') const ipc = electron.ipcRenderer diff --git a/browser/main/lib/mixpanel.js b/browser/main/lib/mixpanel.js new file mode 100644 index 00000000..3214c5f8 --- /dev/null +++ b/browser/main/lib/mixpanel.js @@ -0,0 +1,91 @@ +const _ = require('lodash') +const keygen = require('browser/lib/keygen') +const Mixpanel = require('mixpanel') +const mixpanel = Mixpanel.init('7a0aca437d72dfd07cbcbf58d3b61f27', {key: 'fde4fd23f4d550f1b646bcd7d4374b1f'}) +const moment = require('moment') + +function _getClientKey () { + let clientKey = localStorage.getItem('clientKey') + if (!_.isString(clientKey) || clientKey.length !== 40) { + clientKey = keygen(20) + _setClientKey(clientKey) + } + + return clientKey +} + +function _setClientKey (newKey) { + localStorage.setItem('clientKey', newKey) +} + +function _fetch () { + let events + try { + events = JSON.parse(localStorage.getItem('events')) + if (!_.isArray(events)) throw new Error('events is not an array.') + } catch (err) { + console.warn(err) + events = [] + localStorage.setItem('events', JSON.stringify(events)) + console.info('Events cache initialzed') + } + return events +} + +function _keep (name, properties) { + let events = _fetch() + properties.time = new Date() + events.push({ + name, + properties + }) + localStorage.setItem('events', JSON.stringify(events)) +} + +function _flush () { + let events = _fetch() + let spliced = events.splice(0, 50) + localStorage.setItem('events', JSON.stringify(events)) + + if (spliced.length > 0) { + let parsedEvents = spliced + .filter((event) => { + if (!_.isObject(event)) return false + if (!_.isString(event.name)) return false + if (!_.isObject(event.properties)) return false + if (!moment(event.properties.time).isValid()) return false + if (new Date() - moment(event.properties.time).toDate() > 1000 * 3600 * 24 * 3) return false + return true + }) + .map((event) => { + return { + event: event.name, + properties: event.properties + } + }) + + mixpanel.import_batch(parsedEvents, {}, (errs) => { + if (errs.length > 0) { + let events = _fetch() + events = events.concat(spliced) + localStorage.setItem('events', JSON.stringify(events)) + } + console.log('batched ', errs.length) + _flush() + }) + } +} + +setInterval(_flush, 1000 * 60 * 10) + +function track (name, properties) { + properties = Object.assign({}, properties, { + distinct_id: _getClientKey() + }) + _keep(name, properties) +} + +module.exports = { + _mp: mixpanel, + track +} diff --git a/package.json b/package.json index 44cb7aea..dc66df71 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "markdown-it-emoji": "^1.1.1", "markdown-it-footnote": "^3.0.0", "md5": "^2.0.0", + "mixpanel": "^0.4.1", "moment": "^2.10.3", "node-ipc": "^8.1.0", "sander": "^0.5.1", diff --git a/webpack-skeleton.js b/webpack-skeleton.js index 7d053ccc..f4f2115c 100644 --- a/webpack-skeleton.js +++ b/webpack-skeleton.js @@ -42,6 +42,7 @@ var config = { 'markdown-it-checkbox', 'season', 'devtron', + 'mixpanel', { react: 'var React', 'react-dom': 'var ReactDOM',