65 lines
1.6 KiB
TypeScript
65 lines
1.6 KiB
TypeScript
import { Injectable, isDevMode } from '@angular/core';
|
|
import {
|
|
init as plausibleInit,
|
|
track as plausibleTrack,
|
|
type PlausibleEventOptions,
|
|
} from '@plausible-analytics/tracker';
|
|
|
|
const ANALYTICS_AUTO_CAPTURE_PAGEVIEWS = true;
|
|
const ANALYTICS_DOMAIN = 'schmelczer.dev/towers';
|
|
const ANALYTICS_ENDPOINT = 'https://stats.schmelczer.dev/status';
|
|
|
|
@Injectable({ providedIn: 'root' })
|
|
export class AnalyticsService {
|
|
private isInitialized = false;
|
|
private hasTrackedStart = false;
|
|
|
|
init(): void {
|
|
if (this.isInitialized) return;
|
|
try {
|
|
plausibleInit({
|
|
domain: ANALYTICS_DOMAIN,
|
|
endpoint: ANALYTICS_ENDPOINT,
|
|
autoCapturePageviews: ANALYTICS_AUTO_CAPTURE_PAGEVIEWS,
|
|
logging: isDevMode(),
|
|
});
|
|
this.isInitialized = true;
|
|
} catch (error) {
|
|
console.warn('Could not initialize analytics.', error);
|
|
}
|
|
}
|
|
|
|
private track(eventName: string, options: PlausibleEventOptions = {}): void {
|
|
try {
|
|
plausibleTrack(eventName, options);
|
|
} catch (error) {
|
|
console.warn(`Could not track analytics event "${eventName}".`, error);
|
|
}
|
|
}
|
|
|
|
trackStart(): void {
|
|
if (this.hasTrackedStart) return;
|
|
this.hasTrackedStart = true;
|
|
this.track('Start');
|
|
}
|
|
|
|
trackExampleLoaded(): void {
|
|
this.track('Example Loaded');
|
|
}
|
|
|
|
trackPageCreated(): void {
|
|
this.track('Page Created');
|
|
}
|
|
|
|
trackTowerCreated(): void {
|
|
this.track('Tower Created');
|
|
}
|
|
|
|
trackBlockCreated({ isDone }: { isDone: boolean }): void {
|
|
this.track('Block Created', { props: { isDone: String(isDone) } });
|
|
}
|
|
|
|
trackBlockCompleted(): void {
|
|
this.track('Block Completed');
|
|
}
|
|
}
|