45 lines
1.5 KiB
TypeScript
45 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 "@/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);
|
|
}
|
|
} |