overleaf/services/web/public/coffee/main/event.coffee

104 lines
2.4 KiB
CoffeeScript
Raw Normal View History

define [
"moment"
"base"
2016-07-27 11:53:44 -04:00
"modules/localStorage"
], (moment, App) ->
2016-08-10 12:28:13 -04:00
CACHE_KEY = "mbEvents"
# keep track of how many heartbeats we've sent so we can calculate how
# long wait until the next one
heartbeatsSent = 0
nextHeartbeat = new Date()
2016-08-10 11:42:56 -04:00
send = (category, action, attributes = {})->
ga('send', 'event', category, action)
event_name = "#{action}-#{category}"
Intercom?("trackEvent", event_name, attributes)
2018-01-22 10:00:56 -05:00
2016-08-10 12:28:13 -04:00
App.factory "event_tracking", ($http, localStorage) ->
2018-01-22 10:00:56 -05:00
_getEventCache = () ->
2016-07-27 11:53:44 -04:00
eventCache = localStorage CACHE_KEY
2016-07-27 11:53:44 -04:00
# Initialize as an empy object if the event cache is still empty.
if !eventCache?
eventCache = {}
2018-01-22 10:00:56 -05:00
localStorage CACHE_KEY, eventCache
2016-07-27 11:53:44 -04:00
return eventCache
2016-07-27 11:53:44 -04:00
_eventInCache = (key) ->
curCache = _getEventCache()
curCache[key] || false
2016-07-27 11:53:44 -04:00
_addEventToCache = (key) ->
curCache = _getEventCache()
curCache[key] = true
2016-07-27 11:53:44 -04:00
localStorage CACHE_KEY, curCache
_sendEditingSessionHeartbeat = () ->
$http({
url: "/editingSession/#{window.project_id}",
method: "PUT",
headers: {
"X-CSRF-Token": window.csrfToken
}
})
return {
send: (category, action, label, value)->
ga('send', 'event', category, action, label, value)
2016-07-06 07:26:21 -04:00
2018-05-30 12:42:44 -04:00
sendGAOnce: (category, action, label, value) ->
if ! _eventInCache(action)
_addEventToCache(action)
@send category, action, label, value
editingSessionHeartbeat: () ->
return unless nextHeartbeat <= new Date()
_sendEditingSessionHeartbeat()
heartbeatsSent++
# send two first heartbeats at 0 and 30s then increase the backoff time
# 1min per call until we reach 5 min
backoffSecs = if heartbeatsSent <= 2
30
else if heartbeatsSent <= 6
(heartbeatsSent - 2) * 60
else
300
nextHeartbeat = moment().add(backoffSecs, 'seconds').toDate()
2016-08-10 12:28:13 -04:00
sendMB: (key, segmentation = {}) ->
$http {
url: "/event/#{key}",
2016-08-10 11:42:56 -04:00
method: "POST",
2016-08-10 12:28:13 -04:00
data: segmentation
2016-08-10 11:42:56 -04:00
headers: {
"X-CSRF-Token": window.csrfToken
}
}
2016-08-10 12:28:13 -04:00
sendMBSampled: (key, segmentation) ->
2018-01-22 10:00:56 -05:00
@sendMB key, segmentation if Math.random() < .01
2016-08-10 12:28:13 -04:00
sendMBOnce: (key, segmentation) ->
if ! _eventInCache(key)
_addEventToCache(key)
@sendMB key, segmentation
2018-05-30 12:42:44 -04:00
eventInCache: (key) ->
_eventInCache(key)
}
#header
$('.navbar a').on "click", (e)->
href = $(e.target).attr("href")
if href?
2018-05-30 12:42:44 -04:00
ga('send', 'event', 'navigation', 'top menu bar', href)