/** * 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); } }