umami, glitchtip, redis
Some checks failed
Build & Deploy / deploy (push) Failing after 3m45s

This commit is contained in:
2026-01-18 15:37:51 +01:00
parent 619b699f14
commit b05a21350c
29 changed files with 3568 additions and 316 deletions

View File

@@ -0,0 +1,10 @@
export type AnalyticsEventProperties = Record<
string,
string | number | boolean | null | undefined
>;
export interface AnalyticsService {
track(eventName: string, props?: AnalyticsEventProperties): void;
trackPageview(url?: string): void;
}

View File

@@ -0,0 +1,11 @@
import type { AnalyticsEventProperties, AnalyticsService } from './analytics-service';
export class NoopAnalyticsService implements AnalyticsService {
track(_eventName: string, _props?: AnalyticsEventProperties) {
// intentionally noop
}
trackPageview(_url?: string) {
// intentionally noop
}
}

View File

@@ -0,0 +1,32 @@
import type { AnalyticsEventProperties, AnalyticsService } from './analytics-service';
type UmamiGlobal = {
track?: (eventOrUrl: string, props?: AnalyticsEventProperties) => void;
};
export type UmamiAnalyticsServiceOptions = {
enabled: boolean;
};
export class UmamiAnalyticsService implements AnalyticsService {
constructor(private readonly options: UmamiAnalyticsServiceOptions) {}
track(eventName: string, props?: AnalyticsEventProperties) {
if (!this.options.enabled) return;
if (typeof window === 'undefined') return;
const umami = (window as unknown as { umami?: UmamiGlobal }).umami;
umami?.track?.(eventName, props);
}
trackPageview(url?: string) {
if (!this.options.enabled) return;
if (typeof window === 'undefined') return;
const umami = (window as unknown as { umami?: UmamiGlobal }).umami;
// Umami treats `track(url)` as a pageview override.
if (url) umami?.track?.(url);
else umami?.track?.(window.location.pathname + window.location.search);
}
}