40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
/**
|
|
* Activity Item View Model
|
|
*
|
|
* View model for recent activity items.
|
|
*
|
|
* Accepts ActivityItemViewData as input and produces UI-ready data.
|
|
*/
|
|
import { ViewModel } from "../contracts/view-models/ViewModel";
|
|
import { ActivityItemViewData } from "../view-data/ActivityItemViewData";
|
|
|
|
export class ActivityItemViewModel extends ViewModel {
|
|
private readonly data: ActivityItemViewData;
|
|
|
|
constructor(data: ActivityItemViewData) {
|
|
super();
|
|
this.data = data;
|
|
}
|
|
|
|
get id(): string { return this.data.id; }
|
|
get type(): string { return this.data.type; }
|
|
get message(): string { return this.data.message; }
|
|
get time(): string { return this.data.time; }
|
|
get impressions(): number | undefined { return this.data.impressions; }
|
|
|
|
get typeColor(): string {
|
|
const colors: Record<string, string> = {
|
|
race: 'bg-warning-amber',
|
|
league: 'bg-primary-blue',
|
|
team: 'bg-purple-400',
|
|
driver: 'bg-performance-green',
|
|
platform: 'bg-racing-red',
|
|
};
|
|
return colors[this.type] || 'bg-gray-500';
|
|
}
|
|
|
|
get formattedImpressions(): string | null {
|
|
// Client-only formatting
|
|
return this.impressions ? this.impressions.toLocaleString() : null;
|
|
}
|
|
} |