2018-11-05 05:06:39 -05:00
|
|
|
/* eslint-disable
|
|
|
|
camelcase,
|
|
|
|
max-len,
|
|
|
|
no-return-assign,
|
|
|
|
no-unused-vars,
|
|
|
|
*/
|
|
|
|
// TODO: This file was created by bulk-decaffeinate.
|
|
|
|
// Fix any style issues and re-enable lint.
|
|
|
|
/*
|
|
|
|
* decaffeinate suggestions:
|
|
|
|
* DS102: Remove unnecessary code created because of implicit returns
|
|
|
|
* DS207: Consider shorter variations of null checks
|
|
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
|
|
*/
|
2020-05-19 05:02:56 -04:00
|
|
|
import moment from 'moment'
|
|
|
|
import App from '../base'
|
|
|
|
import '../modules/localStorage'
|
|
|
|
const CACHE_KEY = 'mbEvents'
|
|
|
|
|
|
|
|
// keep track of how many heartbeats we've sent so we can calculate how
|
|
|
|
// long wait until the next one
|
|
|
|
let heartbeatsSent = 0
|
|
|
|
let nextHeartbeat = new Date()
|
|
|
|
|
|
|
|
App.factory('eventTracking', function($http, localStorage) {
|
|
|
|
const _getEventCache = function() {
|
|
|
|
let eventCache = localStorage(CACHE_KEY)
|
|
|
|
|
|
|
|
// Initialize as an empy object if the event cache is still empty.
|
|
|
|
if (eventCache == null) {
|
|
|
|
eventCache = {}
|
|
|
|
localStorage(CACHE_KEY, eventCache)
|
2018-11-05 05:06:39 -05:00
|
|
|
}
|
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
return eventCache
|
|
|
|
}
|
2018-11-05 05:06:39 -05:00
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
const _eventInCache = function(key) {
|
|
|
|
const curCache = _getEventCache()
|
|
|
|
return curCache[key] || false
|
|
|
|
}
|
2018-11-05 05:06:39 -05:00
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
const _addEventToCache = function(key) {
|
|
|
|
const curCache = _getEventCache()
|
|
|
|
curCache[key] = true
|
2018-11-05 05:06:39 -05:00
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
return localStorage(CACHE_KEY, curCache)
|
|
|
|
}
|
2018-11-05 05:06:39 -05:00
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
const _sendEditingSessionHeartbeat = () =>
|
|
|
|
$http({
|
|
|
|
url: `/editingSession/${window.project_id}`,
|
|
|
|
method: 'PUT',
|
|
|
|
headers: {
|
|
|
|
'X-CSRF-Token': window.csrfToken
|
|
|
|
}
|
|
|
|
})
|
2018-11-05 05:06:39 -05:00
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
return {
|
|
|
|
send(category, action, label, value) {
|
|
|
|
return ga('send', 'event', category, action, label, value)
|
|
|
|
},
|
2018-11-05 05:06:39 -05:00
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
sendGAOnce(category, action, label, value) {
|
|
|
|
if (!_eventInCache(action)) {
|
|
|
|
_addEventToCache(action)
|
|
|
|
return this.send(category, action, label, value)
|
|
|
|
}
|
|
|
|
},
|
2018-11-05 05:06:39 -05:00
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
editingSessionHeartbeat() {
|
|
|
|
if (!(nextHeartbeat <= new Date())) {
|
|
|
|
return
|
|
|
|
}
|
2018-11-05 05:06:39 -05:00
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
_sendEditingSessionHeartbeat()
|
2018-11-05 05:06:39 -05:00
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
heartbeatsSent++
|
2018-11-05 05:06:39 -05:00
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
// send two first heartbeats at 0 and 30s then increase the backoff time
|
|
|
|
// 1min per call until we reach 5 min
|
|
|
|
const backoffSecs =
|
|
|
|
heartbeatsSent <= 2
|
|
|
|
? 30
|
|
|
|
: heartbeatsSent <= 6
|
2020-12-15 05:23:54 -05:00
|
|
|
? (heartbeatsSent - 2) * 60
|
|
|
|
: 300
|
2018-11-05 05:06:39 -05:00
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
return (nextHeartbeat = moment()
|
|
|
|
.add(backoffSecs, 'seconds')
|
|
|
|
.toDate())
|
|
|
|
},
|
2018-11-05 05:06:39 -05:00
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
sendMB(key, segmentation) {
|
|
|
|
if (segmentation == null) {
|
|
|
|
segmentation = {}
|
|
|
|
}
|
|
|
|
return $http({
|
|
|
|
url: `/event/${key}`,
|
|
|
|
method: 'POST',
|
|
|
|
data: segmentation,
|
|
|
|
headers: {
|
|
|
|
'X-CSRF-Token': window.csrfToken
|
2018-11-05 05:06:39 -05:00
|
|
|
}
|
2020-05-19 05:02:56 -04:00
|
|
|
})
|
|
|
|
},
|
2018-11-05 05:06:39 -05:00
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
sendMBSampled(key, segmentation) {
|
|
|
|
if (Math.random() < 0.01) {
|
|
|
|
return this.sendMB(key, segmentation)
|
2018-11-05 05:06:39 -05:00
|
|
|
}
|
2020-05-19 05:02:56 -04:00
|
|
|
},
|
|
|
|
|
|
|
|
sendMBOnce(key, segmentation) {
|
|
|
|
if (!_eventInCache(key)) {
|
|
|
|
_addEventToCache(key)
|
|
|
|
return this.sendMB(key, segmentation)
|
|
|
|
}
|
|
|
|
},
|
2018-11-05 05:06:39 -05:00
|
|
|
|
2020-05-19 05:02:56 -04:00
|
|
|
eventInCache(key) {
|
|
|
|
return _eventInCache(key)
|
2018-11-05 05:06:39 -05:00
|
|
|
}
|
2020-05-19 05:02:56 -04:00
|
|
|
}
|
|
|
|
})
|
|
|
|
|
|
|
|
export default $('.navbar a').on('click', function(e) {
|
|
|
|
const href = $(e.target).attr('href')
|
|
|
|
if (href != null) {
|
|
|
|
return ga('send', 'event', 'navigation', 'top menu bar', href)
|
|
|
|
}
|
2018-11-05 05:06:39 -05:00
|
|
|
})
|