/** * 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 "@/lib/display-objects/NumberDisplay"; import { DurationDisplay } from "@/lib/display-objects/DurationDisplay"; import { PercentDisplay } from "@/lib/display-objects/PercentDisplay"; export class AnalyticsMetricsViewModel extends ViewModel { private readonly data: AnalyticsMetricsViewData; constructor(data: AnalyticsMetricsViewData) { super(); this.data = data; } get pageViews(): number { return this.data.pageViews; } get uniqueVisitors(): number { return this.data.uniqueVisitors; } get averageSessionDuration(): number { return this.data.averageSessionDuration; } get bounceRate(): number { return this.data.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); } }