mirror of
https://github.com/BoostIo/Boostnote
synced 2025-12-13 17:56:25 +00:00
122 lines
3.0 KiB
JavaScript
122 lines
3.0 KiB
JavaScript
import store from 'browser/main/store'
|
|
|
|
const _ = require('lodash')
|
|
const keygen = require('browser/lib/keygen')
|
|
const Mixpanel = require('mixpanel')
|
|
const mixpanel = Mixpanel.init('7a0aca437d72dfd07cbcbf58d3b61f27', {key: 'fde4fd23f4d550f1b646bcd7d4374b1f'})
|
|
const moment = require('moment')
|
|
const electron = require('electron')
|
|
|
|
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 _keepUnique (name, properties) {
|
|
let events = _fetch()
|
|
properties.time = new Date()
|
|
events = events.filter((event) => event.name !== name)
|
|
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))
|
|
} else {
|
|
_flush()
|
|
}
|
|
})
|
|
|
|
let state = store.getState()
|
|
mixpanel.people.set(_getClientKey(), {
|
|
storage_count: state.data.storageMap.size,
|
|
note_count: state.data.noteMap.size,
|
|
version: electron.remote.app.getVersion()
|
|
})
|
|
}
|
|
}
|
|
|
|
setInterval(_flush, 1000 * 60 * 60)
|
|
|
|
function track (name, properties) {
|
|
switch (name) {
|
|
case 'MAIN_FOCUSED':
|
|
properties = Object.assign({}, properties, {
|
|
distinct_id: _getClientKey()
|
|
})
|
|
_keepUnique(name, properties)
|
|
break
|
|
default:
|
|
properties = Object.assign({}, properties, {
|
|
distinct_id: _getClientKey()
|
|
})
|
|
_keep(name, properties)
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
_mp: mixpanel,
|
|
track
|
|
}
|