297 lines
6.9 KiB
JavaScript
297 lines
6.9 KiB
JavaScript
import testPilotGA from 'testpilot-ga/src/TestPilotGA';
|
|
import storage from './storage';
|
|
|
|
let hasLocalStorage = false;
|
|
try {
|
|
hasLocalStorage = typeof localStorage !== 'undefined';
|
|
} catch (e) {
|
|
// when disabled, any mention of localStorage throws an error
|
|
}
|
|
|
|
const analytics = new testPilotGA({
|
|
an: 'Firefox Send',
|
|
ds: 'web',
|
|
tid: window.GOOGLE_ANALYTICS_ID
|
|
});
|
|
|
|
let appState = null;
|
|
let experiment = null;
|
|
|
|
export default function initialize(state, emitter) {
|
|
appState = state;
|
|
emitter.on('DOMContentLoaded', () => {
|
|
addExitHandlers();
|
|
experiment = storage.enrolled[0];
|
|
sendEvent(category(), 'visit', {
|
|
cm5: storage.totalUploads,
|
|
cm6: storage.files.length,
|
|
cm7: storage.totalDownloads
|
|
});
|
|
//TODO restart handlers... somewhere
|
|
});
|
|
emitter.on('exit', exitEvent);
|
|
emitter.on('experiment', experimentEvent);
|
|
}
|
|
|
|
function category() {
|
|
switch (appState.route) {
|
|
case '/':
|
|
case '/share/:id':
|
|
return 'sender';
|
|
case '/download/:id/:key':
|
|
case '/download/:id':
|
|
case '/completed':
|
|
return 'recipient';
|
|
default:
|
|
return 'other';
|
|
}
|
|
}
|
|
|
|
function sendEvent() {
|
|
const args = Array.from(arguments);
|
|
if (experiment && args[2]) {
|
|
args[2].xid = experiment[0];
|
|
args[2].xvar = experiment[1];
|
|
}
|
|
return (
|
|
hasLocalStorage && analytics.sendEvent.apply(analytics, args).catch(() => 0)
|
|
);
|
|
}
|
|
|
|
function urlToMetric(url) {
|
|
switch (url) {
|
|
case 'https://www.mozilla.org/':
|
|
return 'mozilla';
|
|
case 'https://www.mozilla.org/about/legal':
|
|
return 'legal';
|
|
case 'https://testpilot.firefox.com/about':
|
|
return 'about';
|
|
case 'https://testpilot.firefox.com/privacy':
|
|
return 'privacy';
|
|
case 'https://testpilot.firefox.com/terms':
|
|
return 'terms';
|
|
case 'https://www.mozilla.org/privacy/websites/#cookies':
|
|
return 'cookies';
|
|
case 'https://github.com/mozilla/send':
|
|
return 'github';
|
|
case 'https://twitter.com/FxTestPilot':
|
|
return 'twitter';
|
|
case 'https://www.mozilla.org/firefox/new/?scene=2':
|
|
return 'download-firefox';
|
|
case 'https://qsurvey.mozilla.com/s3/txp-firefox-send':
|
|
return 'survey';
|
|
case 'https://testpilot.firefox.com/':
|
|
case 'https://testpilot.firefox.com/experiments/send':
|
|
return 'testpilot';
|
|
case 'https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com':
|
|
return 'promo';
|
|
default:
|
|
return 'other';
|
|
}
|
|
}
|
|
|
|
function setReferrer(state) {
|
|
if (category() === 'sender') {
|
|
if (state) {
|
|
storage.referrer = `${state}-upload`;
|
|
}
|
|
} else if (category() === 'recipient') {
|
|
if (state) {
|
|
storage.referrer = `${state}-download`;
|
|
}
|
|
}
|
|
}
|
|
|
|
function externalReferrer() {
|
|
if (/^https:\/\/testpilot\.firefox\.com/.test(document.referrer)) {
|
|
return 'testpilot';
|
|
}
|
|
return 'external';
|
|
}
|
|
|
|
function takeReferrer() {
|
|
const referrer = storage.referrer || externalReferrer();
|
|
storage.referrer = null;
|
|
return referrer;
|
|
}
|
|
|
|
function startedUpload(params) {
|
|
return sendEvent('sender', 'upload-started', {
|
|
cm1: params.size,
|
|
cm5: storage.totalUploads,
|
|
cm6: storage.files.length + 1,
|
|
cm7: storage.totalDownloads,
|
|
cd1: params.type,
|
|
cd5: takeReferrer()
|
|
});
|
|
}
|
|
|
|
function cancelledUpload(params) {
|
|
setReferrer('cancelled');
|
|
return sendEvent('sender', 'upload-stopped', {
|
|
cm1: params.size,
|
|
cm5: storage.totalUploads,
|
|
cm6: storage.files.length,
|
|
cm7: storage.totalDownloads,
|
|
cd1: params.type,
|
|
cd2: 'cancelled'
|
|
});
|
|
}
|
|
|
|
function completedUpload(params) {
|
|
return sendEvent('sender', 'upload-stopped', {
|
|
cm1: params.size,
|
|
cm2: params.time,
|
|
cm3: params.speed,
|
|
cm5: storage.totalUploads,
|
|
cm6: storage.files.length,
|
|
cm7: storage.totalDownloads,
|
|
cd1: params.type,
|
|
cd2: 'completed'
|
|
});
|
|
}
|
|
|
|
function addedPassword(params) {
|
|
return sendEvent('sender', 'password-added', {
|
|
cm1: params.size,
|
|
cm5: storage.totalUploads,
|
|
cm6: storage.files.length,
|
|
cm7: storage.totalDownloads
|
|
});
|
|
}
|
|
|
|
function startedDownload(params) {
|
|
return sendEvent('recipient', 'download-started', {
|
|
cm1: params.size,
|
|
cm4: params.ttl,
|
|
cm5: storage.totalUploads,
|
|
cm6: storage.files.length,
|
|
cm7: storage.totalDownloads
|
|
});
|
|
}
|
|
|
|
function stoppedDownload(params) {
|
|
return sendEvent('recipient', 'download-stopped', {
|
|
cm1: params.size,
|
|
cm5: storage.totalUploads,
|
|
cm6: storage.files.length,
|
|
cm7: storage.totalDownloads,
|
|
cd2: 'errored',
|
|
cd6: params.err
|
|
});
|
|
}
|
|
|
|
function cancelledDownload(params) {
|
|
setReferrer('cancelled');
|
|
return sendEvent('recipient', 'download-stopped', {
|
|
cm1: params.size,
|
|
cm5: storage.totalUploads,
|
|
cm6: storage.files.length,
|
|
cm7: storage.totalDownloads,
|
|
cd2: 'cancelled'
|
|
});
|
|
}
|
|
|
|
function stoppedUpload(params) {
|
|
return sendEvent('sender', 'upload-stopped', {
|
|
cm1: params.size,
|
|
cm5: storage.totalUploads,
|
|
cm6: storage.files.length,
|
|
cm7: storage.totalDownloads,
|
|
cd1: params.type,
|
|
cd2: 'errored',
|
|
cd6: params.err
|
|
});
|
|
}
|
|
|
|
function changedDownloadLimit(params) {
|
|
return sendEvent('sender', 'download-limit-changed', {
|
|
cm1: params.size,
|
|
cm5: storage.totalUploads,
|
|
cm6: storage.files.length,
|
|
cm7: storage.totalDownloads,
|
|
cm8: params.dlimit
|
|
});
|
|
}
|
|
|
|
function completedDownload(params) {
|
|
return sendEvent('recipient', 'download-stopped', {
|
|
cm1: params.size,
|
|
cm2: params.time,
|
|
cm3: params.speed,
|
|
cm5: storage.totalUploads,
|
|
cm6: storage.files.length,
|
|
cm7: storage.totalDownloads,
|
|
cd2: 'completed'
|
|
});
|
|
}
|
|
|
|
function deletedUpload(params) {
|
|
return sendEvent(category(), 'upload-deleted', {
|
|
cm1: params.size,
|
|
cm2: params.time,
|
|
cm3: params.speed,
|
|
cm4: params.ttl,
|
|
cm5: storage.totalUploads,
|
|
cm6: storage.files.length,
|
|
cm7: storage.totalDownloads,
|
|
cd1: params.type,
|
|
cd4: params.location
|
|
});
|
|
}
|
|
|
|
function unsupported(params) {
|
|
return sendEvent(category(), 'unsupported', {
|
|
cd6: params.err
|
|
});
|
|
}
|
|
|
|
function copiedLink(params) {
|
|
return sendEvent('sender', 'copied', {
|
|
cd4: params.location
|
|
});
|
|
}
|
|
|
|
function exitEvent(target) {
|
|
return sendEvent(category(), 'exited', {
|
|
cd3: urlToMetric(target.currentTarget.href)
|
|
});
|
|
}
|
|
|
|
function experimentEvent(params) {
|
|
return sendEvent(category(), 'experiment', params);
|
|
}
|
|
|
|
// eslint-disable-next-line no-unused-vars
|
|
function addExitHandlers() {
|
|
const links = Array.from(document.querySelectorAll('a'));
|
|
links.forEach(l => {
|
|
if (/^http/.test(l.getAttribute('href'))) {
|
|
l.addEventListener('click', exitEvent);
|
|
}
|
|
});
|
|
}
|
|
|
|
function restart(state) {
|
|
setReferrer(state);
|
|
return sendEvent(category(), 'restarted', {
|
|
cd2: state
|
|
});
|
|
}
|
|
|
|
export {
|
|
copiedLink,
|
|
startedUpload,
|
|
cancelledUpload,
|
|
stoppedUpload,
|
|
completedUpload,
|
|
changedDownloadLimit,
|
|
deletedUpload,
|
|
startedDownload,
|
|
cancelledDownload,
|
|
stoppedDownload,
|
|
completedDownload,
|
|
addedPassword,
|
|
restart,
|
|
unsupported
|
|
};
|