Files
gridpilot.gg/apps/website/lib/view-data/LeagueDetailViewData.ts
2026-01-19 02:14:53 +01:00

106 lines
2.2 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;
// Info card data
info: LeagueInfoData;
// Live races
runningRaces: LiveRaceData[];
// Sponsors
sponsors: SponsorInfo[];
// Management
ownerSummary: DriverSummaryData | null;
adminSummaries: DriverSummaryData[];
stewardSummaries: 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;
}