Files
gridpilot.gg/apps/website/lib/view-models/AnalyticsMetricsViewModel.ts
Marc Mintel d97f50ed72
Some checks failed
Contract Testing / contract-tests (pull_request) Failing after 6m4s
Contract Testing / contract-snapshot (pull_request) Has been skipped
view data fixes
2026-01-23 11:59:49 +01:00

46 lines
1.5 KiB
TypeScript

/**
* Analytics metrics view model
* Represents metrics data for analytics
*
* Accepts AnalyticsMetricsViewData as input and produces UI-ready data.
*/
import { AnalyticsMetricsViewData } from "../view-data/AnalyticsMetricsViewData";
import { ViewModel } from "../contracts/view-models/ViewModel";
import { NumberDisplay } from "../display-objects/NumberDisplay";
import { DurationDisplay } from "../display-objects/DurationDisplay";
import { PercentDisplay } from "../display-objects/PercentDisplay";
export class AnalyticsMetricsViewModel extends ViewModel {
readonly pageViews: number;
readonly uniqueVisitors: number;
readonly averageSessionDuration: number;
readonly bounceRate: number;
constructor(viewData: AnalyticsMetricsViewData) {
super();
this.pageViews = viewData.pageViews;
this.uniqueVisitors = viewData.uniqueVisitors;
this.averageSessionDuration = viewData.averageSessionDuration;
this.bounceRate = viewData.bounceRate;
}
/** UI-specific: Formatted page views */
get formattedPageViews(): string {
return NumberDisplay.format(this.pageViews);
}
/** UI-specific: Formatted unique visitors */
get formattedUniqueVisitors(): string {
return NumberDisplay.format(this.uniqueVisitors);
}
/** UI-specific: Formatted session duration */
get formattedSessionDuration(): string {
return DurationDisplay.formatSeconds(this.averageSessionDuration);
}
/** UI-specific: Formatted bounce rate */
get formattedBounceRate(): string {
return PercentDisplay.format(this.bounceRate);
}
}