78 lines
2.1 KiB
TypeScript
78 lines
2.1 KiB
TypeScript
import cleaninsights from "./cleaninsights.service";
|
|
import matomo from "./matomo.service";
|
|
|
|
export interface AnalyticsEngine {
|
|
event(category: string, action: string);
|
|
}
|
|
|
|
type AnalyticsEvent = {
|
|
category: string;
|
|
action: string;
|
|
}
|
|
|
|
export default {
|
|
install(app) {
|
|
class AnalyticsServiceClass {
|
|
|
|
engines: AnalyticsEngine[];
|
|
cachedEvents: AnalyticsEvent[];
|
|
initialized: boolean;
|
|
|
|
constructor() {
|
|
this.engines = [];
|
|
this.cachedEvents = [];
|
|
this.initialized = false;
|
|
|
|
app.$config.promise.then((config) => {
|
|
var analytics = config.analytics || {};
|
|
if (!Array.isArray(analytics)) {
|
|
analytics = [analytics];
|
|
}
|
|
for (const engineConfig of analytics) {
|
|
if (engineConfig.enabled) {
|
|
let type = engineConfig.type || "ci";
|
|
switch (type) {
|
|
case "ci":
|
|
{
|
|
let engine = cleaninsights.install(app, engineConfig.config);
|
|
this.engines.push(engine);
|
|
}
|
|
break;
|
|
case "matomo":
|
|
{
|
|
let engine = matomo.install(app, engineConfig.config);
|
|
this.engines.push(engine);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
this.initialized = true;
|
|
|
|
// Handle cached events
|
|
this.cachedEvents.forEach(({category, action}) => {
|
|
this.event(category, action);
|
|
});
|
|
this.cachedEvents = [];
|
|
});
|
|
}
|
|
|
|
event(category, action) {
|
|
if (!this.initialized) {
|
|
this.cachedEvents.push({category, action});
|
|
return;
|
|
}
|
|
|
|
// Send the event to each configured analytics engine.
|
|
this.engines.forEach((engine) => {
|
|
engine.event(category, action);
|
|
});
|
|
}
|
|
}
|
|
|
|
const analyticsService = new AnalyticsServiceClass();
|
|
app.$analytics = analyticsService;
|
|
app.config.globalProperties.$analytics = analyticsService;
|
|
},
|
|
};
|