108 lines
2.3 KiB
TypeScript
108 lines
2.3 KiB
TypeScript
import { ViewData } from '../contracts/view-data/ViewData';
|
|
|
|
/**
|
|
* LeagueDetailViewData - Pure ViewData for LeagueDetailTemplate
|
|
* Contains only raw serializable data, no methods or computed properties
|
|
*/
|
|
|
|
export interface LeagueInfoData {
|
|
name: string;
|
|
description?: string;
|
|
membersCount: number;
|
|
racesCount: number;
|
|
avgSOF: number | null;
|
|
structure: string;
|
|
scoring: string;
|
|
createdAt: string;
|
|
discordUrl?: string;
|
|
youtubeUrl?: string;
|
|
websiteUrl?: string;
|
|
}
|
|
|
|
export interface SponsorInfo {
|
|
id: string;
|
|
name: string;
|
|
tier: 'main' | 'secondary';
|
|
logoUrl?: string;
|
|
websiteUrl?: string;
|
|
tagline?: string;
|
|
}
|
|
|
|
export interface LiveRaceData {
|
|
id: string;
|
|
name: string;
|
|
date: string;
|
|
registeredCount?: number;
|
|
strengthOfField?: number;
|
|
}
|
|
|
|
export interface DriverSummaryData {
|
|
driverId: string;
|
|
driverName: string;
|
|
avatarUrl: string | null;
|
|
rating: number | null;
|
|
rank: number | null;
|
|
roleBadgeText: string;
|
|
roleBadgeClasses: string;
|
|
profileUrl: string;
|
|
}
|
|
|
|
export interface SponsorMetric {
|
|
icon: any; // React component (lucide-react icon)
|
|
label: string;
|
|
value: string | number;
|
|
color?: string;
|
|
trend?: {
|
|
value: number;
|
|
isPositive: boolean;
|
|
};
|
|
}
|
|
|
|
export interface SponsorshipSlot {
|
|
tier: 'main' | 'secondary';
|
|
available: boolean;
|
|
price: number;
|
|
benefits: string[];
|
|
}
|
|
|
|
export interface LeagueDetailViewData extends ViewData {
|
|
// Basic info
|
|
leagueId: string;
|
|
name: string;
|
|
description: string;
|
|
logoUrl?: string;
|
|
|
|
// Info card data
|
|
info: LeagueInfoData;
|
|
|
|
// Live races
|
|
runningRaces: LiveRaceData[];
|
|
|
|
// Sponsors
|
|
sponsors: SponsorInfo[];
|
|
|
|
// Management
|
|
ownerSummary: DriverSummaryData | null;
|
|
adminSummaries: DriverSummaryData[];
|
|
stewardSummaries: DriverSummaryData[];
|
|
memberSummaries: DriverSummaryData[];
|
|
|
|
// Sponsor insights (for sponsor mode)
|
|
sponsorInsights: {
|
|
avgViewsPerRace: number;
|
|
engagementRate: string;
|
|
estimatedReach: number;
|
|
tier: 'premium' | 'standard' | 'starter';
|
|
trustScore: number;
|
|
discordMembers: number;
|
|
monthlyActivity: number;
|
|
mainSponsorAvailable: boolean;
|
|
secondarySlotsAvailable: number;
|
|
mainSponsorPrice: number;
|
|
secondaryPrice: number;
|
|
totalImpressions: number;
|
|
metrics: SponsorMetric[];
|
|
slots: SponsorshipSlot[];
|
|
} | null;
|
|
}
|