46 lines
1.5 KiB
TypeScript
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);
|
|
}
|
|
} |