services refactor
This commit is contained in:
41
apps/website/lib/view-models/SponsorDashboardViewModel.ts
Normal file
41
apps/website/lib/view-models/SponsorDashboardViewModel.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import type { SponsorDashboardDto } from '../dtos';
|
||||
|
||||
/**
|
||||
* Sponsor Dashboard View Model
|
||||
*
|
||||
* View model for sponsor dashboard data with UI-specific transformations.
|
||||
*/
|
||||
export class SponsorDashboardViewModel implements SponsorDashboardDto {
|
||||
sponsorId: string;
|
||||
sponsorName: string;
|
||||
totalSponsorships: number;
|
||||
activeSponsorships: number;
|
||||
totalInvestment: number;
|
||||
|
||||
constructor(dto: SponsorDashboardDto) {
|
||||
Object.assign(this, dto);
|
||||
}
|
||||
|
||||
/** UI-specific: Formatted total investment */
|
||||
get formattedTotalInvestment(): string {
|
||||
return `$${this.totalInvestment.toLocaleString()}`;
|
||||
}
|
||||
|
||||
/** UI-specific: Active percentage */
|
||||
get activePercentage(): number {
|
||||
if (this.totalSponsorships === 0) return 0;
|
||||
return Math.round((this.activeSponsorships / this.totalSponsorships) * 100);
|
||||
}
|
||||
|
||||
/** UI-specific: Has sponsorships */
|
||||
get hasSponsorships(): boolean {
|
||||
return this.totalSponsorships > 0;
|
||||
}
|
||||
|
||||
/** UI-specific: Status text */
|
||||
get statusText(): string {
|
||||
if (this.activeSponsorships === 0) return 'No active sponsorships';
|
||||
if (this.activeSponsorships === this.totalSponsorships) return 'All sponsorships active';
|
||||
return `${this.activeSponsorships} of ${this.totalSponsorships} active`;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user