Files
gridpilot.gg/apps/website/lib/view-models/ActivityItemViewModel.ts
2026-01-24 01:25:46 +01:00

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;
}
}