/** * Activity Item View Model * * View model for recent activity items. * * Accepts ActivityItemViewData as input and produces UI-ready data. */ import { ActivityItemViewData } from "../view-data/ActivityItemViewData"; import { ViewModel } from "../contracts/view-models/ViewModel"; 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 = { 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; } }