/** * Analytics metrics view model * Represents metrics data for analytics * * Accepts AnalyticsMetricsViewData as input and produces UI-ready data. */ import { DurationFormatter } from "@/lib/formatters/DurationFormatter"; import { NumberFormatter } from "@/lib/formatters/NumberFormatter"; import { PercentFormatter } from "@/lib/formatters/PercentFormatter"; import { ViewModel } from "../contracts/view-models/ViewModel"; import { AnalyticsMetricsViewData } from "../view-data/AnalyticsMetricsViewData"; 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 NumberFormatter.format(this.pageViews); } /** UI-specific: Formatted unique visitors */ get formattedUniqueVisitors(): string { return NumberFormatter.format(this.uniqueVisitors); } /** UI-specific: Formatted session duration */ get formattedSessionDuration(): string { return DurationFormatter.formatSeconds(this.averageSessionDuration); } /** UI-specific: Formatted bounce rate */ get formattedBounceRate(): string { return PercentFormatter.format(this.bounceRate); } }